From cef10560a4855a0cd8a666f6d17b6749119e682a Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 18:33:50 +0200 Subject: [PATCH 01/30] All final projects updated --- .../projects/final/.gitmodules | 4 - .../projects/final/coverage/lcov.info | 0 .../final/integration_test/app_test.dart | 24 + .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 +-- .../final/lib/l10n/app_localizations.dart | 46 +- .../projects/final/lib/main.dart | 1 - .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example}/.metadata | 2 +- .../component_library/example}/README.md | 2 +- .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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 .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example}/assets/animations/loader.json | 0 .../assets/animations/on_off_switch.riv | Bin .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 20 +- .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.lock | 453 ---------- .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../final/packages/domain_models/pubspec.lock | 341 -------- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../final/packages/fav_qs_api/pubspec.lock | 502 ----------- .../final/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../features/forgot_my_password/pubspec.lock | 663 --------------- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.lock | 656 --------------- .../lib/src/quote_details_screen.dart | 1 - .../features/quote_details/pubspec.lock | 738 ---------------- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 1 + .../src/l10n/quote_list_localizations.dart | 45 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 9 +- .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- .../lib/src/quote_paged_list_view.dart | 8 +- .../packages/features/quote_list/pubspec.lock | 796 ------------------ .../packages/features/quote_list/pubspec.yaml | 5 +- .../packages/features/sign_in/pubspec.lock | 670 --------------- .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../packages/features/sign_up/pubspec.lock | 663 --------------- .../features/update_profile/pubspec.lock | 663 --------------- .../final/packages/form_fields/pubspec.lock | 348 -------- .../packages/key_value_storage/pubspec.lock | 604 ------------- .../final/packages/monitoring/pubspec.lock | 488 ----------- .../packages/quote_repository/pubspec.lock | 513 ----------- .../packages/user_repository/pubspec.lock | 527 ------------ .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../projects/final/pubspec.lock | 87 +- .../projects/final/pubspec.yaml | 2 + .../projects/final/test/example_test.dart | 17 + .../projects/final/test/widget_test.dart | 15 - .../final/.dart_tool/package_config.json | 686 --------------- .../final/.dart_tool/package_config_subset | 453 ---------- .../projects/final/.dart_tool/version | 1 - .../projects/final/.flutter-plugins | 20 - .../final/.flutter-plugins-dependencies | 1 - .../projects/final/.gitignore | 126 +++ .../projects/final/.idea/.gitignore | 2 - .../final/.idea/libraries/Dart_Packages.xml | 372 -------- .../final/.idea/libraries/Dart_SDK.xml | 28 - .../final/.idea/libraries/Flutter_Plugins.xml | 7 - .../projects/final/.idea/misc.xml | 6 - .../projects/final/.idea/modules.xml | 8 - .../projects/final/.idea/workspace.xml | 71 -- .../projects/final/.keep | 0 .../projects/final/.packages | 119 --- .../projects/final/.vscode/launch.json | 56 -- .../projects/final/android/.idea/misc.xml | 9 - .../projects/final/android/.idea/modules.xml | 18 - .../final/android/.idea/workspace.xml | 119 --- .../projects/final/android/app/build.gradle | 18 +- .../android/app/src/dev/google-services.json | 47 -- .../src/dev/res/mipmap-hdpi/launcher_icon.png | Bin 3432 -> 0 bytes .../src/dev/res/mipmap-mdpi/launcher_icon.png | Bin 2232 -> 0 bytes .../dev/res/mipmap-xhdpi/launcher_icon.png | Bin 4564 -> 0 bytes .../dev/res/mipmap-xxhdpi/launcher_icon.png | Bin 6570 -> 0 bytes .../dev/res/mipmap-xxxhdpi/launcher_icon.png | Bin 8943 -> 0 bytes .../android/app/src/prod/google-services.json | 39 - .../prod/res/mipmap-hdpi/launcher_icon.png | Bin 2606 -> 0 bytes .../prod/res/mipmap-mdpi/launcher_icon.png | Bin 1671 -> 0 bytes .../prod/res/mipmap-xhdpi/launcher_icon.png | Bin 3496 -> 0 bytes .../prod/res/mipmap-xxhdpi/launcher_icon.png | Bin 5155 -> 0 bytes .../prod/res/mipmap-xxxhdpi/launcher_icon.png | Bin 7091 -> 0 bytes .../projects/final/android/build.gradle | 3 +- .../projects/final/assets/logos/logo-dev.png | Bin 12084 -> 0 bytes .../projects/final/assets/logos/logo.png | Bin 9867 -> 0 bytes .../projects/final/coverage/lcov.info | 208 ----- .../final/flutter_launcher_icons-dev.yaml | 5 - .../final/flutter_launcher_icons-prod.yaml | 5 - .../final/integration_test/app_test.dart | 24 + .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/final/ios/Podfile | 2 +- .../projects/final/ios/Podfile.lock | 180 ---- .../ios/Runner.xcodeproj/project.pbxproj | 593 ++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../AppIcon-dev-1024x1024@1x.png | Bin 68393 -> 0 bytes .../AppIcon-dev-20x20@1x.png | Bin 645 -> 0 bytes .../AppIcon-dev-20x20@2x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-20x20@3x.png | Bin 2159 -> 0 bytes .../AppIcon-dev-29x29@1x.png | Bin 994 -> 0 bytes .../AppIcon-dev-29x29@2x.png | Bin 2101 -> 0 bytes .../AppIcon-dev-29x29@3x.png | Bin 3105 -> 0 bytes .../AppIcon-dev-40x40@1x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-40x40@2x.png | Bin 2861 -> 0 bytes .../AppIcon-dev-40x40@3x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@2x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@3x.png | Bin 5577 -> 0 bytes .../AppIcon-dev-76x76@1x.png | Bin 2674 -> 0 bytes .../AppIcon-dev-76x76@2x.png | Bin 4599 -> 0 bytes .../AppIcon-dev-83.5x83.5@2x.png | Bin 5040 -> 0 bytes .../AppIcon-dev.appiconset/Contents.json | 1 - .../AppIcon-prod-1024x1024@1x.png | Bin 45287 -> 0 bytes .../AppIcon-prod-20x20@1x.png | Bin 480 -> 0 bytes .../AppIcon-prod-20x20@2x.png | Bin 982 -> 0 bytes .../AppIcon-prod-20x20@3x.png | Bin 1478 -> 0 bytes .../AppIcon-prod-29x29@1x.png | Bin 689 -> 0 bytes .../AppIcon-prod-29x29@2x.png | Bin 1460 -> 0 bytes .../AppIcon-prod-29x29@3x.png | Bin 2122 -> 0 bytes .../AppIcon-prod-40x40@1x.png | Bin 982 -> 0 bytes .../AppIcon-prod-40x40@2x.png | Bin 1945 -> 0 bytes .../AppIcon-prod-40x40@3x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@2x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@3x.png | Bin 3743 -> 0 bytes .../AppIcon-prod-76x76@1x.png | Bin 1839 -> 0 bytes .../AppIcon-prod-76x76@2x.png | Bin 3099 -> 0 bytes .../AppIcon-prod-83.5x83.5@2x.png | Bin 3369 -> 0 bytes .../AppIcon-prod.appiconset/Contents.json | 122 --- .../projects/final/ios/Runner/Info.plist | 17 + .../final/ios/Runner/Runner.entitlements | 10 + .../projects/final/ios/config/dev/.ignore | 0 .../ios/config/dev/GoogleService-Info.plist | 34 - .../projects/final/ios/config/prod/.ignore | 0 .../ios/config/prod/GoogleService-Info.plist | 34 - .../projects/final/lib/dynamic_link.dart | 37 - .../lib/generated_plugin_registrant.dart | 22 - .../final/lib/l10n/app_localizations.dart | 22 +- .../final/lib/l10n/app_localizations_en.dart | 3 - .../final/lib/l10n/app_localizations_pt.dart | 12 + .../projects/final/lib/l10n/messages_pt.arb | 4 + .../projects/final/lib/main.dart | 128 ++- .../projects/final/lib/routes.dart | 169 ---- .../projects/final/lib/routing_table.dart | 174 ++++ .../final/lib/screen_view_observer.dart | 41 +- .../final/lib/tab_container_screen.dart | 4 +- .../projects/final/makefile | 23 + .../.dart_tool/package_config.json | 1 - .../.dart_tool/package_config_subset | 293 ------- .../component_library/.dart_tool/version | 1 - .../packages/component_library/.packages | 79 -- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 17 +- .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 6 +- .../example/ios/Runner/Info.plist | 2 + .../example/lib/stories.dart | 16 +- .../component_library/example/pubspec.lock | 327 ------- .../component_library/example/pubspec.yaml | 1 + .../lib/component_library.dart | 1 - .../lib/src/count_indicator_icon_button.dart | 50 +- .../lib/src/exception_indicator.dart | 12 +- .../lib/src/favorite_icon_button.dart | 57 +- .../l10n/component_library_localizations.dart | 45 +- .../component_library_localizations_en.dart | 12 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../lib/src/loading_indicator.dart | 25 - .../lib/src/mixins/animation_mixin.dart | 33 - .../component_library/lib/src/quote_card.dart | 12 +- .../lib/src/rounded_choice_chip.dart | 56 +- .../lib/src/theme/wonder_theme_data.dart | 61 -- .../packages/component_library/pubspec.lock | 502 ----------- .../packages/component_library/pubspec.yaml | 3 +- .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../.dart_tool/package_config.json | 308 ------- .../.dart_tool/package_config_subset | 201 ----- .../packages/domain_models/.dart_tool/version | 1 - .../final/packages/domain_models/.packages | 56 -- .../final/packages/domain_models/pubspec.lock | 348 -------- .../fav_qs_api/.dart_tool/package_config.json | 440 ---------- .../.dart_tool/package_config_subset | 289 ------- .../packages/fav_qs_api/.dart_tool/version | 1 - .../final/packages/fav_qs_api/.packages | 78 -- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../final/packages/fav_qs_api/pubspec.lock | 502 ----------- .../final/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../.dart_tool/package_config.json | 614 -------------- .../.dart_tool/package_config_subset | 405 --------- .../forgot_my_password/.dart_tool/version | 1 - .../forgot_my_password/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/forgot_my_password/.packages | 107 --- .../lib/src/forgot_my_password_cubit.dart | 16 +- .../lib/src/forgot_my_password_dialog.dart | 11 +- .../lib/src/forgot_my_password_state.dart | 19 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.lock | 698 --------------- .../features/forgot_my_password/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 608 ------------- .../.dart_tool/package_config_subset | 401 --------- .../features/profile_menu/.dart_tool/version | 1 - .../features/profile_menu/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../packages/features/profile_menu/.packages | 106 --- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_en.arb | 4 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 28 +- .../l10n/profile_menu_localizations_en.dart | 6 + .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 34 +- .../features/profile_menu/pubspec.lock | 691 --------------- .../features/profile_menu/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 668 --------------- .../.dart_tool/package_config_subset | 441 ---------- .../features/quote_details/.dart_tool/version | 1 - .../features/quote_details/.flutter-plugins | 13 - .../.flutter-plugins-dependencies | 1 - .../packages/features/quote_details/.packages | 116 --- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_cubit.dart | 26 +- .../lib/src/quote_details_screen.dart | 160 ++-- .../lib/src/quote_details_state.dart | 15 +- .../features/quote_details/pubspec.lock | 759 ----------------- .../features/quote_details/pubspec.yaml | 4 +- .../quote_list/.dart_tool/package_config.json | 626 -------------- .../.dart_tool/package_config_subset | 413 --------- .../features/quote_list/.dart_tool/version | 1 - .../features/quote_list/.flutter-plugins | 6 - .../quote_list/.flutter-plugins-dependencies | 1 - .../packages/features/quote_list/.packages | 109 --- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 546 +++++++----- .../quote_list/lib/src/quote_list_event.dart | 44 +- .../quote_list/lib/src/quote_list_screen.dart | 81 +- .../quote_list/lib/src/quote_list_state.dart | 160 ++-- .../lib/src/quote_paged_grid_view.dart | 11 +- .../lib/src/quote_paged_list_view.dart | 8 +- .../quote_list/lib/src/quote_sliver_grid.dart | 84 -- .../packages/features/quote_list/pubspec.lock | 714 ---------------- .../packages/features/quote_list/pubspec.yaml | 12 +- .../sign_in/.dart_tool/package_config.json | 614 -------------- .../sign_in/.dart_tool/package_config_subset | 405 --------- .../features/sign_in/.dart_tool/version | 1 - .../features/sign_in/.flutter-plugins | 6 - .../sign_in/.flutter-plugins-dependencies | 1 - .../final/packages/features/sign_in/.packages | 107 --- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../sign_in/lib/src/sign_in_cubit.dart | 117 +-- .../sign_in/lib/src/sign_in_screen.dart | 139 +-- .../sign_in/lib/src/sign_in_state.dart | 36 +- .../packages/features/sign_in/pubspec.lock | 698 --------------- .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/.dart_tool/package_config.json | 614 -------------- .../sign_up/.dart_tool/package_config_subset | 405 --------- .../features/sign_up/.dart_tool/version | 1 - .../features/sign_up/.flutter-plugins | 6 - .../sign_up/.flutter-plugins-dependencies | 1 - .../final/packages/features/sign_up/.packages | 107 --- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../sign_up/lib/src/sign_up_cubit.dart | 134 ++- .../sign_up/lib/src/sign_up_screen.dart | 184 ++-- .../sign_up/lib/src/sign_up_state.dart | 38 +- .../packages/features/sign_up/pubspec.lock | 698 --------------- .../packages/features/sign_up/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 614 -------------- .../.dart_tool/package_config_subset | 405 --------- .../update_profile/.dart_tool/version | 1 - .../features/update_profile/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/update_profile/.packages | 107 --- .../lib/src/l10n/messages_en.arb | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../lib/src/update_profile_cubit.dart | 62 +- .../lib/src/update_profile_screen.dart | 119 +-- .../lib/src/update_profile_state.dart | 40 +- .../features/update_profile/pubspec.lock | 698 --------------- .../features/update_profile/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 314 ------- .../.dart_tool/package_config_subset | 205 ----- .../packages/form_fields/.dart_tool/version | 1 - .../final/packages/form_fields/.packages | 57 -- .../packages/form_fields/lib/form_fields.dart | 3 +- .../packages/form_fields/lib/src/email.dart | 38 +- .../lib/src/optional_password.dart | 20 +- .../src/optional_password_confirmation.dart | 38 +- .../form_fields/lib/src/password.dart | 30 +- .../lib/src/password_confirmation.dart | 34 +- .../form_fields/lib/src/username.dart | 37 +- .../final/packages/form_fields/pubspec.lock | 355 -------- .../final/packages/form_fields/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 530 ------------ .../.dart_tool/package_config_subset | 349 -------- .../key_value_storage/.dart_tool/version | 1 - .../key_value_storage/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../packages/key_value_storage/.packages | 93 -- .../lib/key_value_storage.dart | 2 +- .../lib/src/key_value_storage.dart | 15 +- .../lib/src/models/models.dart | 3 +- .../lib/src/models/user_cm.dart | 16 - .../lib/src/models/user_cm.g.dart | 44 - .../packages/key_value_storage/pubspec.lock | 604 ------------- .../key_value_storage/test/common_test.dart | 2 +- .../monitoring/.dart_tool/package_config.json | 404 --------- .../.dart_tool/package_config_subset | 265 ------ .../packages/monitoring/.dart_tool/version | 1 - .../packages/monitoring/.flutter-plugins | 5 - .../monitoring/.flutter-plugins-dependencies | 1 - .../final/packages/monitoring/.packages | 72 -- .../packages/monitoring/lib/monitoring.dart | 9 +- .../monitoring/lib/src/analytics_service.dart | 27 + .../lib/src/dynamic_link_service.dart | 60 ++ .../lib/src/error_reporting_service.dart | 27 + .../packages/monitoring/lib/src/logger.dart | 7 - .../lib/src/remote_value_service.dart | 24 + .../final/packages/monitoring/pubspec.lock | 455 ---------- .../final/packages/monitoring/pubspec.yaml | 8 +- .../packages/monitoring/test/common_test.dart | 15 - .../.dart_tool/package_config.json | 452 ---------- .../.dart_tool/package_config_subset | 297 ------- .../quote_repository/.dart_tool/version | 1 - .../quote_repository/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../final/packages/quote_repository/.packages | 80 -- .../packages/quote_repository/pubspec.lock | 513 ----------- .../.dart_tool/package_config.json | 464 ---------- .../.dart_tool/package_config_subset | 305 ------- .../user_repository/.dart_tool/version | 1 - .../packages/user_repository/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../final/packages/user_repository/.packages | 82 -- .../lib/src/mappers/cache_to_domain.dart | 9 - .../lib/src/mappers/mappers.dart | 2 +- .../lib/src/mappers/remote_to_cache.dart | 11 - .../lib/src/mappers/remote_to_domain.dart | 11 + .../lib/src/user_local_storage.dart | 15 - .../lib/src/user_repository.dart | 98 +-- .../lib/src/user_secure_storage.dart | 50 +- .../packages/user_repository/pubspec.lock | 527 ------------ .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../projects/final/propagate-config-files.sh | 199 +++++ .../projects/final/pubspec.lock | 342 ++++---- .../projects/final/pubspec.yaml | 47 +- .../projects/final/test/example_test.dart | 17 + .../projects/final/test/widget_test.dart | 15 - .../projects/final/.gitmodules | 4 - .../final/integration_test/app_test.dart | 24 + .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/final/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 +-- .../projects/final/ios/Runner/Info.plist | 15 + .../final/ios/Runner/Runner.entitlements | 10 + .../final/lib/l10n/app_localizations.dart | 22 +- .../final/lib/l10n/app_localizations_en.dart | 3 - .../final/lib/l10n/app_localizations_pt.dart | 12 + .../projects/final/lib/l10n/messages_pt.arb | 4 + .../projects/final/lib/main.dart | 54 +- .../projects/final/lib/routes.dart | 179 ---- .../projects/final/lib/routing_table.dart | 174 ++++ .../final/lib/tab_container_screen.dart | 4 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example}/.metadata | 2 +- .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 25 +- .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.yaml | 2 +- .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../final/packages/domain_models/pubspec.yaml | 2 +- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../final/packages/fav_qs_api/pubspec.yaml | 9 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.yaml | 2 +- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.yaml | 2 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 4 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- .../lib/src/quote_paged_grid_view.dart | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.yaml | 7 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../packages/features/sign_up/pubspec.yaml | 2 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../features/update_profile/pubspec.yaml | 2 +- .../final/packages/form_fields/pubspec.yaml | 2 +- .../packages/key_value_storage/pubspec.yaml | 2 +- .../packages/monitoring/lib/monitoring.dart | 1 - .../lib/src/dynamic_link_service.dart | 65 +- .../monitoring/lib/src/explicit_crash.dart | 14 - .../final/packages/monitoring/pubspec.yaml | 13 +- .../packages/quote_repository/pubspec.yaml | 2 +- .../packages/user_repository/pubspec.yaml | 7 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../projects/final/pubspec.lock | 179 ++-- .../projects/final/pubspec.yaml | 6 +- .../projects/final/test/example_test.dart | 17 + .../projects/final/test/widget_test.dart | 15 - .../project/final/.gitmodules | 4 - .../final/integration_test/app_test.dart | 24 + .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../project/final/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 +-- .../project/final/ios/Runner/Info.plist | 15 + .../final/ios/Runner/Runner.entitlements | 10 + .../final/lib/l10n/app_localizations.dart | 22 +- .../final/lib/l10n/app_localizations_en.dart | 3 - .../final/lib/l10n/app_localizations_pt.dart | 12 + .../project/final/lib/l10n/messages_pt.arb | 4 + .../project/final/lib/main.dart | 54 +- .../project/final/lib/routes.dart | 178 ---- .../project/final/lib/routing_table.dart | 174 ++++ .../final/lib/tab_container_screen.dart | 4 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example}/.metadata | 2 +- .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../final/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 2 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- .../lib/src/quote_paged_grid_view.dart | 11 +- .../lib/src/quote_paged_list_view.dart | 8 +- .../packages/features/quote_list/pubspec.yaml | 5 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../packages/features/sign_in/pubspec.yaml | 3 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../monitoring/lib/src/analytics_service.dart | 2 +- .../lib/src/dynamic_link_service.dart | 62 +- .../lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/pubspec.yaml | 13 +- .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../project/final/pubspec.lock | 197 +++-- .../project/final/pubspec.yaml | 4 +- .../project/final/test/example_test.dart | 17 + .../project/final/test/widget_test.dart | 15 - .../projects/final/.gitmodules | 4 - .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/final/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 98 +-- .../projects/final/ios/Runner/Info.plist | 17 +- .../final/ios/Runner/Runner.entitlements | 10 + .../final/lib/l10n/app_localizations.dart | 22 +- .../final/lib/l10n/app_localizations_en.dart | 3 - .../final/lib/l10n/app_localizations_pt.dart | 12 + .../projects/final/lib/l10n/messages_pt.arb | 4 + .../projects/final/lib/main.dart | 26 +- .../projects/final/lib/routing_table.dart | 21 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example}/.metadata | 2 +- .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.yaml | 6 +- .../favorite_icon_button_widget_test.dart | 52 +- .../final/packages/domain_models/pubspec.yaml | 2 +- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../final/packages/fav_qs_api/pubspec.yaml | 2 +- .../fav_qs_api/test/sign_in_test.dart | 49 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.yaml | 4 +- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.yaml | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 4 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- .../lib/src/quote_paged_grid_view.dart | 82 ++ .../lib/src/quote_paged_list_view.dart | 77 ++ .../packages/features/quote_list/pubspec.yaml | 9 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../packages/features/sign_in/pubspec.yaml | 2 +- .../sign_in/test/sign_in_cubit_test.dart | 4 +- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../packages/features/sign_up/pubspec.yaml | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../features/update_profile/pubspec.yaml | 4 +- .../final/packages/form_fields/pubspec.yaml | 2 +- .../packages/key_value_storage/pubspec.yaml | 4 +- .../lib/src/dynamic_link_service.dart | 62 +- .../final/packages/monitoring/pubspec.yaml | 11 +- .../packages/quote_repository/pubspec.yaml | 4 +- .../packages/user_repository/pubspec.yaml | 4 +- .../user_repository/test/mappers_test.dart | 24 +- .../test/user_repository_test.dart | 23 +- .../projects/final/pubspec.lock | 134 ++- .../projects/final/pubspec.yaml | 2 +- .../projects/final/.github/workflows/cicd.yml | 128 --- .../projects/final/.gitmodules | 4 - .../projects/final/.metadata | 10 - .../final/integration_test/app_test.dart | 2 +- .../final/ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/final/ios/Gemfile | 7 - .../projects/final/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 +-- .../projects/final/ios/Runner/Info.plist | 17 +- .../final/ios/Runner/Runner.entitlements | 10 + .../projects/final/ios/fastlane/Appfile | 6 - .../projects/final/ios/fastlane/Fastfile | 102 --- .../projects/final/ios/fastlane/Matchfile | 13 - .../projects/final/ios/fastlane/Pluginfile | 5 - .../final/lib/l10n/app_localizations.dart | 22 +- .../final/lib/l10n/app_localizations_en.dart | 3 - .../final/lib/l10n/app_localizations_pt.dart | 12 + .../projects/final/lib/l10n/messages_pt.arb | 4 + .../projects/final/lib/main.dart | 26 +- .../projects/final/lib/routing_table.dart | 21 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example/.metadata | 10 + .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 2 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- .../lib/src/quote_paged_grid_view.dart | 82 ++ .../lib/src/quote_paged_list_view.dart | 77 ++ .../quote_list/lib/src/quote_sliver_grid.dart | 85 -- .../quote_list/lib/src/quote_sliver_list.dart | 77 -- .../packages/features/quote_list/pubspec.yaml | 5 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../monitoring/lib/src/analytics_service.dart | 2 +- .../lib/src/dynamic_link_service.dart | 62 +- .../final/packages/monitoring/pubspec.yaml | 11 +- .../projects/final/pubspec.lock | 118 ++- 1095 files changed, 18252 insertions(+), 40911 deletions(-) delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/.gitmodules delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/coverage/lcov.info create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/integration_test/app_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.gitignore rename {12-supporting-the-development-lifecycle-with-firebase/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/.metadata (82%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/README.md (97%) create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/analysis_options.yaml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/build.gradle create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/build.gradle create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle.properties create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/settings.gradle rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/assets/animations/loader.json (100%) rename {11-create-your-own-widget-catalog/projects/final => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example}/assets/animations/on_off_switch.riv (100%) create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename 11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme => 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (90%) create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Info.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/component_storybook.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/main.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/story_app.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/pubspec.yaml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/favicon.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-192.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/index.html create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/manifest.json delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/pubspec.lock create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/domain_models/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/common_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/forgot_my_password/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/pubspec.lock rename 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_list.dart => 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart (94%) delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.lock create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_up/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/features/update_profile/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/form_fields/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/key_value_storage/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/quote_repository/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/common_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/test/example_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/final/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/.flutter-plugins-dependencies create mode 100644 11-create-your-own-widget-catalog/projects/final/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_Packages.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_SDK.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/libraries/Flutter_Plugins.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/.keep delete mode 100644 11-create-your-own-widget-catalog/projects/final/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/.vscode/launch.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/assets/logos/logo-dev.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/assets/logos/logo.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/coverage/lcov.info delete mode 100644 11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-dev.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-prod.yaml create mode 100644 11-create-your-own-widget-catalog/projects/final/integration_test/app_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Podfile.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/Contents.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json create mode 100644 11-create-your-own-widget-catalog/projects/final/ios/Runner/Runner.entitlements delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/config/dev/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/config/dev/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/config/prod/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/final/ios/config/prod/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/final/lib/dynamic_link.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/lib/generated_plugin_registrant.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/lib/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/final/lib/routes.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/lib/routing_table.dart rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/home_screen.dart => 11-create-your-own-widget-catalog/projects/final/lib/tab_container_screen.dart (92%) delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/loading_indicator.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/mixins/animation_mixin.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/domain_models/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/domain_models/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/l10n.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart => 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart (92%) rename 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart => 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart (94%) delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/form_fields/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.g.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/.packages create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/analytics_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/error_reporting_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/logger.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/test/common_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/quote_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_cache.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_domain.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/propagate-config-files.sh create mode 100644 11-create-your-own-widget-catalog/projects/final/test/example_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/final/test/widget_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/.gitmodules create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/integration_test/app_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Runner.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/messages_pt.arb delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routes.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routing_table.dart rename 11-create-your-own-widget-catalog/projects/final/lib/home_screen.dart => 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/tab_container_screen.dart (92%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.gitignore rename {10-dynamic-theming-and-dark-mode/projects/final => 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example}/.metadata (82%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/README.md create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/analysis_options.yaml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/build.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/build.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle.properties create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/settings.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/loader.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename 11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme => 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (79%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Info.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/component_storybook.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/main.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/story_app.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/pubspec.yaml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/favicon.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-192.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/index.html create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/manifest.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/widget_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/common_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/l10n.yaml delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart => 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart (92%) rename 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/widget_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/common_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/test/example_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.gitmodules create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/integration_test/app_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Runner.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/messages_pt.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routes.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routing_table.dart rename 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/home_screen.dart => 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/tab_container_screen.dart (92%) create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.gitignore rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/{ => packages/component_library/example}/.metadata (82%) create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/README.md create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/analysis_options.yaml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/build.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/build.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle.properties create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/settings.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/loader.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Info.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/component_storybook.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/main.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/story_app.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/pubspec.yaml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/favicon.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-192.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/index.html create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/manifest.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/common_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart => 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart (92%) rename 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart => 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart (94%) create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/widget_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/common_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/example_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/widget_test.dart delete mode 100644 14-automated-testing/projects/final/.gitmodules create mode 100644 14-automated-testing/projects/final/ios/Runner/Runner.entitlements create mode 100644 14-automated-testing/projects/final/lib/l10n/app_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/lib/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/component_library/example/.gitignore rename 14-automated-testing/projects/final/{ => packages/component_library/example}/.metadata (82%) create mode 100644 14-automated-testing/projects/final/packages/component_library/example/README.md create mode 100644 14-automated-testing/projects/final/packages/component_library/example/analysis_options.yaml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/.gitignore create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/build.gradle create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/build.gradle create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/gradle.properties create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 14-automated-testing/projects/final/packages/component_library/example/android/settings.gradle create mode 100644 14-automated-testing/projects/final/packages/component_library/example/assets/animations/loader.json create mode 100644 14-automated-testing/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/.gitignore create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Info.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/lib/component_storybook.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/example/lib/main.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/example/lib/story_app.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/example/pubspec.yaml create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/favicon.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-192.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-512.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/index.html create mode 100644 14-automated-testing/projects/final/packages/component_library/example/web/manifest.json create mode 100644 14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 14-automated-testing/projects/final/packages/features/quote_details/l10n.yaml delete mode 100644 14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart create mode 100644 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart create mode 100644 14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/.gitmodules delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/.metadata delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/Gemfile create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Runner.entitlements delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Appfile delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Fastfile delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Matchfile delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Pluginfile create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/README.md create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/analysis_options.yaml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/build.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/build.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle.properties create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/settings.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/loader.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Info.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/component_storybook.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/main.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/story_app.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/pubspec.yaml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/favicon.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-192.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/index.html create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/manifest.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/l10n.yaml delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart delete mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart diff --git a/10-dynamic-theming-and-dark-mode/projects/final/.gitmodules b/10-dynamic-theming-and-dark-mode/projects/final/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/10-dynamic-theming-and-dark-mode/projects/final/coverage/lcov.info b/10-dynamic-theming-and-dark-mode/projects/final/coverage/lcov.info deleted file mode 100644 index e69de29b..00000000 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/integration_test/app_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/ios/Flutter/AppFrameworkInfo.plist b/10-dynamic-theming-and-dark-mode/projects/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/ios/Flutter/AppFrameworkInfo.plist +++ b/10-dynamic-theming-and-dark-mode/projects/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/ios/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/final/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/ios/Runner.xcodeproj/project.pbxproj +++ b/10-dynamic-theming-and-dark-mode/projects/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/lib/l10n/app_localizations.dart b/10-dynamic-theming-and-dark-mode/projects/final/lib/l10n/app_localizations.dart index 910b586a..e47fb9f9 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/lib/l10n/app_localizations.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/lib/l10n/app_localizations.dart @@ -8,14 +8,14 @@ import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_pt.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -60,8 +60,7 @@ import 'app_localizations_pt.dart'; /// be consistent with the languages listed in the AppLocalizations.supportedLocales /// property. abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -69,8 +68,7 @@ abstract class AppLocalizations { return Localizations.of(context, AppLocalizations)!; } - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +80,7 @@ abstract class AppLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -109,8 +106,7 @@ abstract class AppLocalizations { String get profileBottomNavigationBarItemLabel; } -class _AppLocalizationsDelegate - extends LocalizationsDelegate { +class _AppLocalizationsDelegate extends LocalizationsDelegate { const _AppLocalizationsDelegate(); @override @@ -119,25 +115,25 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; } AppLocalizations lookupAppLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return AppLocalizationsEn(); - case 'pt': - return AppLocalizationsPt(); + case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/lib/main.dart b/10-dynamic-theming-and-dark-mode/projects/final/lib/main.dart index 7af87913..1daed5a7 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/lib/main.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/lib/main.dart @@ -4,7 +4,6 @@ import 'dart:isolate'; import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/closing-quote.svg b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/closing-quote.svg +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/opening-quote.svg b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/opening-quote.svg +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/.metadata b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata similarity index 82% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/final/.metadata rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata index 56bfc2c4..be0f63d8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/.metadata +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e channel: stable project_type: app diff --git a/11-create-your-own-widget-catalog/projects/final/README.md b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/README.md similarity index 97% rename from 11-create-your-own-widget-catalog/projects/final/README.md rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/README.md index 3be5e496..a1356260 100644 --- a/11-create-your-own-widget-catalog/projects/final/README.md +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/README.md @@ -1,4 +1,4 @@ -# wonder_words +# example A new Flutter project. diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/analysis_options.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/build.gradle b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/build.gradle b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle.properties b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/settings.gradle b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/assets/animations/loader.json b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/assets/animations/loader.json similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/assets/animations/loader.json rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/assets/animations/loader.json diff --git a/11-create-your-own-widget-catalog/projects/final/assets/animations/on_off_switch.riv b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv similarity index 100% rename from 11-create-your-own-widget-catalog/projects/final/assets/animations/on_off_switch.riv rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 90% rename from 11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 577477e2..3db53b6e 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + - - + + + + + buildConfiguration = "Debug"> diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Info.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/component_storybook.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/main.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/story_app.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/favicon.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-192.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-512.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/index.html b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/manifest.json b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/exception_indicator.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/exception_indicator.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/quote_card.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/quote_card.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/search_bar.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/search_bar.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/pubspec.lock deleted file mode 100644 index 2a449518..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/pubspec.lock +++ /dev/null @@ -1,453 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/domain_models/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/domain_models/pubspec.lock deleted file mode 100644 index c8257f2f..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/domain_models/pubspec.lock +++ /dev/null @@ -1,341 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.lock deleted file mode 100644 index 050431ab..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.10" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.2" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.18.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.5" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.4" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/common_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/forgot_my_password/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/forgot_my_password/pubspec.lock deleted file mode 100644 index baa95ca8..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/forgot_my_password/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: transitive - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/pubspec.lock deleted file mode 100644 index e5faddfa..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/profile_menu/pubspec.lock +++ /dev/null @@ -1,656 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 4a299464..c4242afc 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/pubspec.lock deleted file mode 100644 index d1e133dc..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_details/pubspec.lock +++ /dev/null @@ -1,738 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.10" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.3" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.0" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.10.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb index 2c14fe76..95d9446b 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", "lifeTagLabel": "Vida", "happinessTagLabel": "Felicidade", "workTagLabel": "Trabalho", diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 2779e237..2c7c3736 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -60,18 +61,15 @@ import 'quote_list_localizations_pt.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -83,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -103,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -146,36 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); - case 'pt': - return QuoteListLocalizationsPt(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart index 35866a86..31101779 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for Portuguese (`pt`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsPt extends QuoteListLocalizations { QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; @override String get lifeTagLabel => 'Vida'; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_list.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.lock deleted file mode 100644 index 37ecf0da..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.lock +++ /dev/null @@ -1,796 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - bloc_concurrency: - dependency: "direct main" - description: - name: bloc_concurrency - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase_analytics: - dependency: transitive - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.2" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.3" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - firebase_crashlytics: - dependency: transitive - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.5" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.11" - firebase_dynamic_links: - dependency: transitive - description: - name: firebase_dynamic_links - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.2" - firebase_dynamic_links_platform_interface: - dependency: transitive - description: - name: firebase_dynamic_links_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.3+7" - firebase_remote_config: - dependency: transitive - description: - name: firebase_remote_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.11" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: "direct main" - description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - monitoring: - dependency: "direct main" - description: - path: "../../monitoring" - relative: true - source: path - version: "0.0.0" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.yaml index 34294525..7eef55f0 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/pubspec.yaml @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.lock deleted file mode 100644 index 0d3d74b6..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.lock +++ /dev/null @@ -1,670 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.20.2" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.11" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.yaml index 71824a86..ad03a384 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/pubspec.yaml @@ -20,9 +20,10 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 flutter: - uses-material-design: true \ No newline at end of file + uses-material-design: true diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_up/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_up/pubspec.lock deleted file mode 100644 index c8f59e47..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/sign_up/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/update_profile/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/features/update_profile/pubspec.lock deleted file mode 100644 index c8f59e47..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/update_profile/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/form_fields/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/form_fields/pubspec.lock deleted file mode 100644 index b626dbbc..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/form_fields/pubspec.lock +++ /dev/null @@ -1,348 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - formz: - dependency: "direct main" - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/key_value_storage/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/key_value_storage/pubspec.lock deleted file mode 100644 index 7dc62f20..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/key_value_storage/pubspec.lock +++ /dev/null @@ -1,604 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "38.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "3.4.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.10" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.3" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.3" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: "direct main" - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - hive_generator: - dependency: "direct dev" - description: - name: hive_generator - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: "direct main" - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.2" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.2" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/pubspec.lock deleted file mode 100644 index 2fa251d8..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/pubspec.lock +++ /dev/null @@ -1,488 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.2" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.3" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - firebase_crashlytics: - dependency: "direct main" - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.5" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.11" - firebase_dynamic_links: - dependency: "direct main" - description: - name: firebase_dynamic_links - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.2" - firebase_dynamic_links_platform_interface: - dependency: transitive - description: - name: firebase_dynamic_links_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.3+7" - firebase_remote_config: - dependency: "direct main" - description: - name: firebase_remote_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.11" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=1.20.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/quote_repository/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/quote_repository/pubspec.lock deleted file mode 100644 index 36be18ff..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/quote_repository/pubspec.lock +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.lock deleted file mode 100644 index 3abec2a7..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.lock +++ /dev/null @@ -1,527 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/common_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.mocks.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/final/pubspec.lock index eb69273c..803bac5d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/pubspec.lock +++ b/10-dynamic-theming-and-dark-mode/projects/final/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -237,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -262,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -301,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -318,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "1a7291cc7d1705f42482d450ecf1f2889ec75ce6" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -365,21 +385,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -407,7 +427,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -477,7 +497,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -622,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -650,21 +670,28 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: @@ -749,13 +776,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.6.1" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -769,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.4.1" + version: "5.3.1" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/final/pubspec.yaml index f154f50d..b2dd1e71 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/final/pubspec.yaml @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/test/example_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/final/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config.json deleted file mode 100644 index e9793c44..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../packages/component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cupertino_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../packages/domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../packages/fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_dynamic_links", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_launcher_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../packages/features/forgot_my_password", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "form_fields", - "rootUri": "../packages/form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../packages/key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../packages/monitoring", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_info", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../packages/features/profile_menu", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../packages/features/quote_details", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_list", - "rootUri": "../packages/features/quote_list", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_repository", - "rootUri": "../packages/quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "routemaster", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../packages/features/sign_in", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sign_up", - "rootUri": "../packages/features/sign_up", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../packages/features/update_profile", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../packages/user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "wonder_words", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:26.265806Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config_subset deleted file mode 100644 index 6623bcc1..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.dart_tool/package_config_subset +++ /dev/null @@ -1,453 +0,0 @@ -wonder_words -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/lib/ -flutter_launcher_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -routemaster -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/.flutter-plugins deleted file mode 100644 index da75d698..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.flutter-plugins +++ /dev/null @@ -1,20 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -firebase_dynamic_links=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -package_info=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ diff --git a/11-create-your-own-widget-catalog/projects/final/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/.flutter-plugins-dependencies deleted file mode 100644 index 30c9d660..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/","dependencies":[]}],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]},{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_dynamic_links","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","dependencies":[]},{"name":"package_info","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:26.445866","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.gitignore b/11-create-your-own-widget-catalog/projects/final/.gitignore new file mode 100644 index 00000000..a801afa8 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/.gitignore @@ -0,0 +1,126 @@ +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/* + +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* + +# Flutter repo-specific +/bin/cache/ +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/docs/doc/ +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds +.fvm/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +**/android/.idea/ +*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/.last_build_id +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Coverage +coverage/ + +# Submodules +!pubspec.lock +packages/**/pubspec.lock + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to the above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/launch.json +!.idea/codeStyles/ +!.idea/dictionaries/ +!.idea/runConfigurations/ diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/.gitignore b/11-create-your-own-widget-catalog/projects/final/.idea/.gitignore deleted file mode 100644 index 4b922951..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/shelf/ diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_Packages.xml b/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_Packages.xml deleted file mode 100644 index b82a1a79..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_Packages.xml +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_SDK.xml b/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_SDK.xml deleted file mode 100644 index d5634f1a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Dart_SDK.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Flutter_Plugins.xml b/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Flutter_Plugins.xml deleted file mode 100644 index b0f69711..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/libraries/Flutter_Plugins.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/final/.idea/misc.xml deleted file mode 100644 index f8c5fc91..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/final/.idea/modules.xml deleted file mode 100644 index 2504908a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/final/.idea/workspace.xml deleted file mode 100644 index d48a48fb..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.idea/workspace.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1636557511999 - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.keep b/11-create-your-own-widget-catalog/projects/final/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/final/.packages b/11-create-your-own-widget-catalog/projects/final/.packages deleted file mode 100644 index 514142a6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.packages +++ /dev/null @@ -1,119 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:26.224192. -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:packages/component_library/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:packages/domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:packages/fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/lib/ -flutter_launcher_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -forgot_my_password:packages/features/forgot_my_password/lib/ -form_fields:packages/form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:packages/key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -monitoring:packages/monitoring/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -profile_menu:packages/features/profile_menu/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/lib/ -quote_details:packages/features/quote_details/lib/ -quote_list:packages/features/quote_list/lib/ -quote_repository:packages/quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -routemaster:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sign_in:packages/features/sign_in/lib/ -sign_up:packages/features/sign_up/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -update_profile:packages/features/update_profile/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -user_repository:packages/user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -wonder_words:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/.vscode/launch.json b/11-create-your-own-widget-catalog/projects/final/.vscode/launch.json deleted file mode 100644 index 6bed9c18..00000000 --- a/11-create-your-own-widget-catalog/projects/final/.vscode/launch.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "wonder_words (dev)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "dev", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (prod)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "prod", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (profile mode)", - "request": "launch", - "type": "dart", - "flutterMode": "profile" - }, - { - "name": "fav_qs_api", - "cwd": "packages/fav_qs_api", - "request": "launch", - "type": "dart" - }, - { - "name": "quote_repository", - "cwd": "packages/quote_repository", - "request": "launch", - "type": "dart" - }, - { - "name": "user_repository", - "cwd": "packages/user_repository", - "request": "launch", - "type": "dart" - } - ] -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/android/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/final/android/.idea/misc.xml deleted file mode 100644 index 6199cc2a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/android/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/final/android/.idea/modules.xml deleted file mode 100644 index 09b8b0ca..00000000 --- a/11-create-your-own-widget-catalog/projects/final/android/.idea/modules.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/android/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/final/android/.idea/workspace.xml deleted file mode 100644 index 4cf51c19..00000000 --- a/11-create-your-own-widget-catalog/projects/final/android/.idea/workspace.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1635811920603 - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/build.gradle b/11-create-your-own-widget-catalog/projects/final/android/app/build.gradle index 9f73c425..7d93d0b6 100644 --- a/11-create-your-own-widget-catalog/projects/final/android/app/build.gradle +++ b/11-create-your-own-widget-catalog/projects/final/android/app/build.gradle @@ -24,31 +24,17 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' +apply plugin: 'com.google.firebase.crashlytics' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - - flavorDimensions "flavor-type" - - productFlavors { - dev { - dimension "flavor-type" - applicationIdSuffix ".dev" - versionNameSuffix "-dev" - } - prod { - dimension "flavor-type" - } - } - - compileSdkVersion 30 + compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.raywenderlich.wonder_words" minSdkVersion 21 targetSdkVersion 30 diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/google-services.json b/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/google-services.json deleted file mode 100644 index 9cd7d360..00000000 --- a/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/google-services.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "project_info": { - "project_number": "67633443658", - "firebase_url": "https://wonder-words-dev-default-rtdb.firebaseio.com", - "project_id": "wonder-words-dev", - "storage_bucket": "wonder-words-dev.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:67633443658:android:a76ea13116df0119a8c7b3", - "android_client_info": { - "package_name": "com.raywenderlich.wonder_words.dev" - } - }, - "oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBJZHdBdsSfW8Sjqt4-ShjBj0_4wZVrQBA" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.raywenderlich.wonderWordsDev" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 7953212c6e49fb52569d83b90c2f7e2c16a0e428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3432 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 y>%SWBE%dLBHW>W`7>s@b3`Rcz2BV(Xsb< diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/final/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 2482b9d7804a578b39be249cbd522783e378dc37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6570 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 QxBvhE07*qoM6N<$f(6gmV*mgE diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index bb3c5bbfb374a4216810949d95497d1323f7c17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 zcmV;226*|2P)2^CVQp`=NZCLuqZ*m3+HbMJe$<9QSRli+fs=lMN9pL5^6 z_uV&%3=cWv|C&IlFbmjOyBk`oPJ&fxgG#jlEYcRd>%gX93uE(wKRgYA=m^X%55lB( z5IljQA0P(bbH4c8`zfkVKqBU<!U>*3gj78ZirZ26-Xjvf&(DL&CTnNW_ z>h%QHCx{jFYfZLeOa;Y9MgdNnYRW)`f`WO5t!p~mU;MVj(P&}a0mnPO0juRvxPI># z+?g9pe{2*WTdXDj-~#&oGN#q#&=vS=;g6EWYOJV5@;@T^_QZ8hb^&x+Jw@%rMnrSF?aZV}PtogOlrE-hq*Yv$zUhE`l}(k$+~_IV>pO$14eHZAe?;zu{0^ zVt2C(6*2`O%r+0u>LH!3;xN8=9q5wg6m_YL1-@Q;0c?})EtK}0s;`OH)txxH&wQ?WK`|sjP8pt^2p_Wr%mk+UX zH~PII*ivT1^y~s0O8yHOr8dg@n$m*=+c9m9nfln#Y`u?tjyt%Qu`ap=mxqpFdEqnl zbJ}e1xcfsO3sXg#+;gOZ&p<4@fMoFG1KI~vV~YDHEW^R(*HJ*9sn79_H<0`pKC{9BKOscWOtle=o++6YMz| zBHM1zl1~s911XX6M*R}T!bia0A2mRu$_b}~R@G57qD}6Cr#s(;dgo~x0UQ|u*YG=O zpIHUOi&%`vZ%M>da3{Ma@)Y1AXclT%;8WbZ%?OcYo3;F2B;>IY7mq3%j|mF4Oo2$C zS)kW2L7g*hR(VFt2bHQrytTgXMqPOfM;50y7k>x2(25+clLTKVb5^6qSBM)03hY*s zF|&ih*P-Ox51697Y!KC{EU6Q3ivl*o{>6cp?X^&?Nm!1gc!~m|Wh;RTz;p$)+NFv@ zqkxr&saPr-Z~>IwD3CJ5KmCT7MwiQ00G|QcQf74_ zUn1X@D?GSiG7vNh@P#HIf>AsfkeFhs9O=lKw7Q*Gt8~v)&u2;sap9c$(NRyFlOdCT zr;a6#fyh14LyQ6@y?5Z|_$jD!b^`5F`CsU%Sy^-0WvnFWJC?NX%46+Zjk^{(A`op|jHb%GyFm4t?%3Moz_%EJLQqEKk7NL8AEgoOGd1lSCh0GnZ*fJ6)+8Vumkby!;Pb2G$( zZFt;-C5$B|zX#+y=CMp-nZPmzsksX(0nHIFY-s;A9=)eZ-{->; z$MRmOB%3~iC4 zo5eCuWr4lZ=hFKzsjT%l!qy|%U&7-{kk0%8N5}KG&A^~&a&eL%k3d{lMo5q3tcT#&ce{-18{QS85|i|%e5>b zh-^SqdL^;=1uCEZ?8BFcj}--ZQn1WqS(%kbj2PX}*7!8svF>lsf9-Q{V&ETWz^&Z3 zXdogWCcSz+$~Y(;bZ^+l%5}1XltbZXa%_Z5qq?8YGLnorA!={I(Qq6+uWuj;-&{&I z!Wse8vpwZFJw-ru1*v!$DT?|cBBth9nJv&;VYCxphpjyu;OHAWk%Z~$HOM}Q2ne&Q zswjLTDC(=x&kBtYB48BN%~(b|GU&=Xk%Rz}a2Jx0scpk*4-o-D>D60f0`&06YO6g0 zusj5CWtI`4;&$lm*o&Uh0hn3b+DJ4H2ubhd>i=pWfM1?OBAQTDT}(4qmqtP?vn3pHb~U3~u;v9hg#eO$S`(2- zX9jI+OO;@49^e!elv&^>Xrt-Z>}yPQV2uDf-B2yYxH!-hjHFN7)f7V{VgZN-+hA&L z7=}}pf>!1Pg#BzD;DixCA@5OcGIkUvViR^XheH%K^&M+JgmaT04#S?eH2a( zye_)coPc#`w!sXLtA0e zd?1Ka5Q{6@NdU>5LJ^akuzvw3241wOMJmE5z7KTmN8x`J3Z>KwjiD$KFlAPSMFMPO zU;@?7RjwC}|}zX2N!OL1c6(_{J~N`~{Ak{l4wJKN0g{?`=i(Bw{Z>)xzmOA5i<&HGXB?*+Y7l3}BD?wF`b=MX?`Cxd$_t@LA6-27$GWz)w1%CZ3j7;x_ z=U@AYtv)}wn;-1@Bntm2P*X1%qG*Fx$Z`(ojAcAhu?>*J(N`hpv_%fsrst_4qZtUP&%cZ9$;m9vwsk)W!j&kOKAkaYKhDi^6{xb^arc zNZ9S`-i5E53(ixfNOO=sN2=P(4FTais{RC!i%DM2jA6cF8iju!JoD;LZSVPn&Ug&< z{@1`r6SRemmuiU^wdq3nSyMsPQbeS7XmVvN{2}PSwjE9k{Mix0C#+B036!gZJFuqpgj@21?MSIENCLv5;I8ZI|9g04tUr|P|*f6nc1p-Po-#%kmvIl=v4^$ z{4GJ_dlXce0FTu9t7QYcvgdG_llP6VE^#XiP9Ce$w^WX8YqsO-`?zz|6)8hcG%4jL zW5S&g#R*7AVT|gBqn8Dk@4t{A1s?2eJJ9$ZE8F-|bn>RQ4+HICOU?ZrZONIk+t(SV zEbM)t?{=hm^fO%}@Rw9T07d<3K>$r$Xc%ANM#0CRD;|f_Ln9^E*BOt()*cEG+yzW% zQ&`tdIP~)2vf9_%@mXM-5mnI6ptwNwDDZO(2zT|^lUYUtP_}a>-$9yCkoO<~kC#+W zvN4Fl{}mo>)0~ZB5B@oPeC;qi`|9zM>bt3}4exyj^u3?9XIae<=TrHGF%)}N#OTMg z;gG(dS?y|TybnouqNJSvzMeh63tvG4)^`Z&+lcjzTB?iO&fZlt=~~X6r>yK~3H{W| z#e-%kh_jPZENZ>*493Kc<1zT2s0qfgmslMJ0 z+B&<7J4f0i5i0HX(>+82%is|1@U$Pa6b*& z=;U%aCO@FrxfBWPhD{w$qES9?S|1Cz9RxM4gkf3Gn&H(#i3bq@=}g5VpthhO)0C&^NDKgTguj+7JQtQZkbCm(>^3-calo)XiuHfw zh6g}D=^|ae+@j&tLz?RVrA`XnIx_-j;FZ||iy(ouqk-#BDGnQD5_}m2@+=zAmkO@$ z>t2b%r(+(cOF!v}%G> zgcKArs88Ac%5Uu3fg|WJj;tg3GwTwc0R3|?B*SYGY_kI2Vk5vS3-hhK0VRX{2&`*; z4$hB_pzyzg=k8Xo$8vpxxr(4sHO_5u^B)1i>~-zbAhr zTu^cb0R-}3mT|qd6?OOL(I`_dx*xP_6SNK+5lm4?h|2={jOy!A6&*xXbT7J{6l&hc z-9vlO^eU|^9P0U^QB^uB zUJ+xxr=CmWG%ui@NQ?H$_bQ3|G(VnG|GU|v$pqCqbOs`p=UX57+3Jj7g0^0Wfp@@$F~sH=Su zv&#t1Gs3k53A>uAtr(QegkgV+=+d{>2&fm75fE>v*aqa(H@o+$E+VMOxywYCnh`*? zEc!=+)g2@?bwBfRlPe`yQ$b6`2Gj%Of~rQi89L)0I5$#Mf)-Vf3(Fwkt8OSg=$vF+ zRFjAZa8*#L;8y^Gaw(et7o{T0DGlXu|3!Dp7bjq9PBJIbv8#xzgC~HZp{83^ixa^9 z!NQV!V0KMWn1UZRyIiD#7K&8rq8Rk6z=>D{y`Z9(TO+{w?1t_mt2!zt4YX%PWz z{mzwt`AE%Gq=IAuTm~wDX^Ofv0Dy)LCk=-6EW-H2~hr@W>J_EFfu(0 z@dj4~l@B7Ig6D?L%(Le=xFf(i_z^%Fq#`5C*mG?_xu6bQ5dkch&n2K-jESE5B_e=r zYI6xF7h|I5UkHqF`YI%w*kdIr#oH(UPf3rw8(h+N)qSLpV~~?yl+3_|oSJfyl`|id zf90Ez&yk$wIfFSQ`Wk@|&iq&U`fSbvZ|aP>LV!m{fO0PX*@U2)Jr1*kzbPJGPV-q2 zy7ssn3{Lz@bcs0u{Ua~IjVty*EOZ-wq9=heC-_JYiwY{^pXCJnAJwIvg z#`f;cdgtfw`{tW(zG-3#3J%az?Hf?=Hxz*s96=FC!4VXJ6dXYjNWl@jAyBL<#A1;a zsIO&IYi|!l^H6NnKC$(^5h;BT!DQ8C3;(lBu7)}r&oPc zmQgu|N)MF?m2O@@qDEdqIi(P3rV(kL$}E*6mAxzx-%tNPr1CzM57_Yd|ETO@All%N z?b}yy2l50O=f& zB@k58xvYBR5dl&QWcntRH6)c_JH1KeDI(HyM5rMpnY@D>ftGYGp}z~VuREKx(iqC8 zR4UD_8Tvnmk}~S^ym$lLMLU(#G9?yS&jwb$L-oyU`+*nOyL$%N-otZVHC~U9BT#2c zjO9|LhXz(1l4ewj6KIA=HBDt|Ui&|j@`6|((@B}q*K<1+*i1K(RNA7Xk~@$!qC4|m zH8;q&*bveR&h6muWyW8eRFm@>sZeHJl~y4B*GVe9K~m|DM5JF3kv>sGat2ufwPtG# zytn~$E!1FJqgDW&RI@pf3giOG<{Xg5?uXxB>n`B)XPJ^m`(aXT!vx!M+XDR1548Kv#Vj9il8w zYXlmfW$fT=G5ZNWj)#auX-=Zb-LsD&OCV#~qR}l2+G9XMg}EISZDDMbNHjKMrQ+}d zd4NdtA=~)+zbkyFzJz@O`Gh}tXrh~5OdN^Q*VsR!5y{LW*m)b-K>tZ>)7FEPze#^V zb}A!>KsBnu$^nS9G)zV~ef^;+%~g<( z)8~^3k)eGVTM@mF?HHY^#;y4U_WeM$YDCMTg{0AuM52$9nt#c_QLHa|0uktqYTcS2 zV4pxikU%;>BFyXUna+I|Ul74^ia7m4H10WhUYS zB!cGnOnyF+Y;^MDYTS;WU|#|S3FC7jBl=yYY@m{`FM)!h!Vvl~CJab?p6wV7W>`m} z7i;d8Gpqz29>=N`+oMhU5-2Dt3}GH-1A2-c?6cLl9ZxaP-^^l>E2;KFro}*E1uzyG zT+TLa9kFxC@(Gma#b54i3kZ1-(y@P9^vNsqP~Wfg?RW}pMe#s78cZ$Wj z*4kN&DIu_o;S5nPV-6fLcfL;>`5RWaVPVj zVDpHLW?(asCm4ovtgDe!*UzbT0ki5QENw#kxB15e0znE%JqUXe$S+>#dG6~G57&X6 z887VMkpBbck=S%#-&)ggIiEk~r7J;gfs zS1Nc{-asSIIaIr!X*P@)i&~A;Io2y`tk1WAO#;;@dtfZX*4Z~@HB<*6lI|e#JP`=H zXJF-*=wD?8Ofr4g`4; zy^Smufz4x09spV0!UCIG&r@mk1$k-%VVGAtqcD(1yr#VnIA8-C+;t1-_h6*>O~lWm zzuzc%+(HXJggAlBalGOYToKrlK-Dy&@tqHoy4r0yEs+c8wY!NtKO?&*7>fi4`eE%qv9j+tm2dXY$EF-TEq6kZyz{psCBaOBm@x8&UL)&WN2Ta?e#2QHX zhdfBddJJ}vS@nBLARJpg5~cWLXlY{^Kz#3ai9CM~gw3O)FN)1)u4bkBVR2Z?fm96Q zk(jhb@{a^MFjFphupQI|q_*A(6nTIZQS1k@py)A3G#V+RTg3#D?qh$9!m#jfv}7)D zs41*4xP)!my1N2*Raqo@Lo{qZzvwX#I*>l)*r?+4Jf0fS)l*^9CG$RGboBs9o!iJ* zo~Y1WRTijYJBJ(=3cm5FAJ;JmtM1RDJ`Dwxp z`O_7p;8KP;f2c4RghIDP2IC}oo(?Q|fPs~WYhGjdIiAguu-p&ZB_SZI!m5K7p6hv1 z=*n4^ajXpv{jSotRS~R+BGBtsOxvtj45+Sl$?kD!pA&z?1HmXn4nxHE2tK894H=nF z5Q&1}Y1V;IjWdtK_M%_2Jf?$wSc_WZ`$XTWB44UY`^#*4qHUe!4A>bFVF=-Ejd>WS;B%g)SzJ|C7pIFa_&ORSBLS2wjw1D8U(h0&)-8nBjr zv2S_i`$4dJA`UwQb5Q89XUTAXj@t7^>S^n`zQ>AronbUvO;?nHI4ICV0@;|Ubsd;p zhCfI=fqEX1=nm@8!>+eG(7%YTji4=%M;|9&NXG4xYhz5q%aS z>2#^9yBPQf>kUY6u=*0)JwnAak?fspCj$ z7mF0{anLS;#qMHOaXC$VB6n>9 z$gT^kEwu10EcXg+p$FOOV^3$Bx9uzIT8Z9n>coes1{);*$znxktj!3Ofb@&g>yIZy zp7Be_pq^!eyKXK!v}E1Rf&WncipJ9DH z>)F`k#U)jlmcbOM;LbFC2J#%$ZvM5l@CAE2lZ6rxy?iB+5t%M7DLFqE>uR9;{593S zV0jEAt-xAR_m#@+Voiymo!#(2grqv6-)lL z)b^Wfczi?A>6L+%XE9CciP6NJr(O(v@$692*PY--e@PPNt7O=k z4Mfe?gLEjEb24`kI<9b4XCW{uIy5Van8b-crR)ET+I~-XZlV|K+3#by8~NF}2fNUd z7CLad27^EVVq%bW-kg!+M3OL<(f{A(y{l!lK#)3iW;TyU;PLLZ?$<2Pxfx?#D20$} zZUYeoQ!HjD-HPbh3_CA;F0_u?d?~BSGy-F0 z|0K(6_PFSAE(V7L4Hkhi1~vU^Cz2v*u!dC0$?UUBMu<$$(Ce7#e2^yIZg038<(_eI zQY)yk2e>MmA~N+b&Gr#9q_x3ak8?5P^QS^<<7*js_%J;8m~7@oQW>y!K%73)d3q|8 zHk-eC-7{{UpVM(F5$Adaqdpc{NB@trycSfKn;z%#5zvK&vRFul=clupe<&ZP3XjKQ zL;k={hmS+|jEhG#XyqqFBHYv!MX%9O!ESNL(_j(^s%#lalMjWe%nYc#1um!z*g}ge zv!DX-G~dgLO_r8Qir_l(8uN5*yuScDW@%X4+MpPq?xM}^bsB6T81dpINPxA0wWN%s z2;Rce>>LKnnXPIQk!B;&c%fQ>v_N1QMs02mm0=6T!rDApzCn!_)(v54jvG;i&Y&bv z9?)IzP-6yt_oNn#pD}iuHOb?Zp^En4Wd0~`p3J&2kT^44Q3b;}okQ}zXq%T=TKx;8 zxjm*sn>mM_Q3*AHHWvw_Ci4Nm(^8KehUKHql5EPLAygU1TrS|tLEKQX$Q&ie+8J)G+*1&}A5#~@Gl%22Qas7u5XVMT3j%u*{i;;X8; z(uIQyPxs2mYga)6%{-PGQV0S0u*2YHsP^g>^ke>rxU5l9}PD%fD9U?z}xa=8SQ z3ae+p{>kM}U(W)zd7IQF6oKj)uz&KkiFFby3)m!((qVysd7iL%3Sj|c2xP=Z1UDOD zePPbjkv+1PkRec6S-ur~1oM2arxHjZXqY!ipzcgUbBQJ4ia_-YbCL+;WQ4Dw?Db(X z1X7lB&|oGIMq%KDCj?4nYiY%$K)@W=g^4+YW|p0$LwTa>8Dat<>~_4|ODG$tUIFfy z{XifP?4Y4?FC#-BW9_bzKmkD7YCV6a%vH)K(BQ6VmWaz-TcMVbW>$hgYC1!yuzH4= zK;~QlMIb|jj%K?M4@?09HE))TEJRD%r=sL1AKW=Mpz4ql?~)?h;1McNGb<{EP)PZYvpVqpx`$kC$ZGFm$C#hEOhg-SOx#%5c6<09x$?I zD-{+*9P)B11287q6oG<>iK0793m{7%VSE0 zf@))r2Zc2MqZ0#tGsl-N&a+KhZeX#dv;ytc7$J1I|NejB@}@a96=FC!4VXJ6dXYjNWl>lffO7;5lF!i6oC{R;r|Y^kRoWJ RKb-&o002ovPDHLkV1j6qon`<4 diff --git a/11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/final/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index f0a687ad7334f44ca7f7905874a4f18292e10de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7091 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 z 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 S2=71R0Llt#^5wE70sjY7kFd!A diff --git a/11-create-your-own-widget-catalog/projects/final/android/build.gradle b/11-create-your-own-widget-catalog/projects/final/android/build.gradle index c5a41754..a4793051 100644 --- a/11-create-your-own-widget-catalog/projects/final/android/build.gradle +++ b/11-create-your-own-widget-catalog/projects/final/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.10' repositories { google() jcenter() @@ -9,6 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } diff --git a/11-create-your-own-widget-catalog/projects/final/assets/logos/logo-dev.png b/11-create-your-own-widget-catalog/projects/final/assets/logos/logo-dev.png deleted file mode 100644 index 671a752d59878614a0b355ef7505eed09ff8e18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12084 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 diff --git a/11-create-your-own-widget-catalog/projects/final/coverage/lcov.info b/11-create-your-own-widget-catalog/projects/final/coverage/lcov.info deleted file mode 100644 index d714c7c1..00000000 --- a/11-create-your-own-widget-catalog/projects/final/coverage/lcov.info +++ /dev/null @@ -1,208 +0,0 @@ -SF:lib/main.dart -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:36,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:50,1 -DA:52,0 -DA:54,0 -DA:55,0 -DA:84,0 -DA:86,0 -DA:87,0 -DA:88,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:111,0 -DA:115,0 -DA:117,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:122,0 -DA:123,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:142,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -LF:46 -LH:1 -end_of_record -SF:lib/dynamic_link.dart -DA:10,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:20,0 -DA:21,0 -DA:23,0 -DA:27,0 -DA:31,0 -DA:34,0 -DA:35,0 -LF:12 -LH:0 -end_of_record -SF:lib/home_screen.dart -DA:7,1 -DA:9,0 -DA:11,0 -DA:13,0 -DA:14,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:27,0 -DA:28,0 -LF:14 -LH:1 -end_of_record -SF:lib/l10n/app_localizations.dart -DA:63,0 -DA:67,0 -DA:68,0 -DA:109,1 -DA:111,0 -DA:113,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:123,0 -DA:128,0 -DA:129,0 -DA:133,0 -LF:13 -LH:1 -end_of_record -SF:lib/l10n/app_localizations_en.dart -DA:8,0 -DA:10,0 -DA:13,0 -LF:3 -LH:0 -end_of_record -SF:lib/routes.dart -DA:18,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:31,0 -DA:32,0 -DA:34,0 -DA:37,0 -DA:38,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:46,0 -DA:51,0 -DA:52,0 -DA:54,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:70,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:79,0 -DA:80,0 -DA:82,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:97,0 -DA:101,0 -DA:104,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:110,0 -DA:111,0 -DA:113,0 -DA:114,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:120,0 -DA:122,0 -DA:123,0 -DA:131,0 -DA:133,0 -DA:135,0 -DA:136,0 -DA:137,0 -DA:146,0 -DA:148,0 -DA:150,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -DA:160,0 -DA:162,0 -DA:165,0 -LF:73 -LH:0 -end_of_record -SF:lib/screen_view_observer.dart -DA:8,0 -DA:11,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:27,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:45,0 -DA:47,0 -DA:50,0 -LF:19 -LH:0 -end_of_record diff --git a/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-dev.yaml b/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-dev.yaml deleted file mode 100644 index 3e0eb9e0..00000000 --- a/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-dev.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo-dev.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-prod.yaml b/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-prod.yaml deleted file mode 100644 index ee32842d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/flutter_launcher_icons-prod.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/integration_test/app_test.dart b/11-create-your-own-widget-catalog/projects/final/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Flutter/AppFrameworkInfo.plist b/11-create-your-own-widget-catalog/projects/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Flutter/AppFrameworkInfo.plist +++ b/11-create-your-own-widget-catalog/projects/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Podfile b/11-create-your-own-widget-catalog/projects/final/ios/Podfile index 9411102b..85198f16 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Podfile +++ b/11-create-your-own-widget-catalog/projects/final/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '10.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Podfile.lock b/11-create-your-own-widget-catalog/projects/final/ios/Podfile.lock deleted file mode 100644 index 1294231a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/ios/Podfile.lock +++ /dev/null @@ -1,180 +0,0 @@ -PODS: - - Firebase/Analytics (8.5.0): - - Firebase/Core - - Firebase/Core (8.5.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.5.0) - - Firebase/CoreOnly (8.5.0): - - FirebaseCore (= 8.5.0) - - Firebase/DynamicLinks (8.5.0): - - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 8.5.0) - - firebase_analytics (8.3.0): - - Firebase/Analytics (= 8.5.0) - - firebase_core - - Flutter - - firebase_core (1.5.0): - - Firebase/CoreOnly (= 8.5.0) - - Flutter - - firebase_dynamic_links (2.0.8): - - Firebase/DynamicLinks (= 8.5.0) - - firebase_core - - Flutter - - FirebaseAnalytics (8.5.0): - - FirebaseAnalytics/AdIdSupport (= 8.5.0) - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseCore (8.5.0): - - FirebaseCoreDiagnostics (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - FirebaseCoreDiagnostics (8.6.0): - - GoogleDataTransport (~> 9.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - nanopb (~> 2.30908.0) - - FirebaseDynamicLinks (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (8.6.0): - - FirebaseCore (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/UserDefaults (~> 7.4) - - PromisesObjC (< 3.0, >= 1.2) - - Flutter (1.0.0) - - flutter_secure_storage (3.3.1): - - Flutter - - GoogleAppMeasurement (8.5.0): - - GoogleAppMeasurement/AdIdSupport (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.5.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.1.0): - - GoogleUtilities/Environment (~> 7.2) - - nanopb (~> 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.5.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/Network (7.5.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.5.0)" - - GoogleUtilities/Reachability (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.5.0): - - GoogleUtilities/Logger - - nanopb (2.30908.0): - - nanopb/decode (= 2.30908.0) - - nanopb/encode (= 2.30908.0) - - nanopb/decode (2.30908.0) - - nanopb/encode (2.30908.0) - - package_info (0.0.1): - - Flutter - - path_provider (0.0.1): - - Flutter - - PromisesObjC (2.0.0) - - share_plus (0.0.1): - - Flutter - - url_launcher (0.0.1): - - Flutter - -DEPENDENCIES: - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) - - Flutter (from `Flutter`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseDynamicLinks - - FirebaseInstallations - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_dynamic_links: - :path: ".symlinks/plugins/firebase_dynamic_links/ios" - Flutter: - :path: Flutter - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - -SPEC CHECKSUMS: - Firebase: ff8c73105b90e33e1dc6c8e5445d7adc2ccdc7c1 - firebase_analytics: 3b7d92b8d1a3482f557c201e5e46c2f7fa2644ff - firebase_core: 82d486a6231b636aea229bd471bceca82cbe00a6 - firebase_dynamic_links: 0768a32e69be5b6f9af258f8e072537dff6b8969 - FirebaseAnalytics: 96325c1e0acbd2bb805c6a613028b1fe599d6a37 - FirebaseCore: 1c1ca72483b59b17050f5b4cec4fb748425a3901 - FirebaseCoreDiagnostics: 3721920bde3a9a6d5aa093c1d25e9d3e47f694af - FirebaseDynamicLinks: 6e406b3bb669f8c8a63e7254bb63251fa3f88a43 - FirebaseInstallations: 0ede6ffcd215b8f93c19d9b06c1c54e2d4107e98 - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - GoogleAppMeasurement: 8d10c1c470fcb0e5143ed74fddd164f0a0384800 - GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 - GoogleUtilities: eea970f4a389963963bffe8d8fabe43540678b9c - nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - -PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea - -COCOAPODS: 1.10.2 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/project.pbxproj index a859a809..3053d607 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/project.pbxproj +++ b/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */; }; - BBB11ED626B6BF050025AFC5 /* config in Resources */ = {isa = PBXBuildFile; fileRef = BBB11ED526B6BF050025AFC5 /* config */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -32,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -51,12 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "GoogleService-Info.plist"; path = "config/prod/GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; - BBB11ED526B6BF050025AFC5 /* config */ = {isa = PBXFileReference; lastKnownFileType = folder; path = config; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,12 +85,11 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( - BBB11ED526B6BF050025AFC5 /* config */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -105,7 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */, + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -121,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -149,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, + 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -174,7 +159,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -206,69 +191,66 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BBB11ED626B6BF050025AFC5 /* config in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); - name = "Thin Binary"; + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -276,32 +258,33 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "Copy Firebase config to specific location"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#1\nscheme=\"default\"\n\n#2\nif [[ $CONFIGURATION =~ -([^-]*)$ ]]; then\n#3\nscheme=${BASH_REMATCH[1]}\nfi\n\necho $scheme\n\n#4\nGOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist\nGOOGLESERVICE_INFO_FILE=${PROJECT_DIR}/config/${scheme}/${GOOGLESERVICE_INFO_PLIST}\n\n#5\necho \"Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_FILE}\"\nif [ ! -f $GOOGLESERVICE_INFO_FILE ]\nthen\necho \"No GoogleService-Info.plist found. Please ensure it's in the proper directory.\"\nexit 1\nfi\n\n#6\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\necho \"Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}\"\n\n#7\ncp \"${GOOGLESERVICE_INFO_FILE}\" \"${PLIST_DESTINATION}\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + name = "Run Script"; + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -337,233 +320,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-prod"; - }; - 249021D4217E4FDB00AE95B9 /* Profile-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-prod"; - }; - 97C147031CF9000F007C117D /* Debug-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-prod"; - }; - 97C147041CF9000F007C117D /* Release-prod */ = { - 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 = 10.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-prod"; - }; - 97C147061CF9000F007C117D /* Debug-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - 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-prod"; - }; - 97C147071CF9000F007C117D /* Release-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-prod"; - }; BB141C0626CFD1FC000800DE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -611,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -684,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -759,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -791,248 +547,15 @@ }; name = Profile; }; - BBB6099C26B6B74C00182666 /* Debug-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-dev"; - }; - BBB6099D26B6B74C00182666 /* Debug-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - 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-dev"; - }; - BBB6099E26B6B75700182666 /* Release-dev */ = { - 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 = 10.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-dev"; - }; - BBB6099F26B6B75700182666 /* Release-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-dev"; - }; - BBB609A026B6B75E00182666 /* Profile-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-dev"; - }; - BBB609A126B6B75E00182666 /* Profile-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-dev"; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug-prod */, BB141C0626CFD1FC000800DE /* Debug */, - BBB6099C26B6B74C00182666 /* Debug-dev */, - 97C147041CF9000F007C117D /* Release-prod */, BB141C0826CFD229000800DE /* Release */, - BBB6099E26B6B75700182666 /* Release-dev */, - 249021D3217E4FDB00AE95B9 /* Profile-prod */, BB141C0A26CFD23A000800DE /* Profile */, - BBB609A026B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1040,15 +563,9 @@ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug-prod */, BB141C0726CFD1FC000800DE /* Debug */, - BBB6099D26B6B74C00182666 /* Debug-dev */, - 97C147071CF9000F007C117D /* Release-prod */, BB141C0926CFD229000800DE /* Release */, - BBB6099F26B6B75700182666 /* Release-dev */, - 249021D4217E4FDB00AE95B9 /* Profile-prod */, BB141C0B26CFD23A000800DE /* Profile */, - BBB609A126B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 240137a2..271470a7 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ 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%0D<}o z>-TI~id(4$eIw_MogY!kCK#pz1RTs~uk5AGn5{q)aY`$As@sc!bv8Oi#d#_mvF8iYSx36B-p zZy1s^^r%XWItm6BKkLctR5MIg7FU{H;P|a9in|pAQixxs}ICt~Q zmk?qhiv6Xbwbs|HMqfmdd05y>E8FW6-T`_FhE1r2SUIzC*O8W6{|Ab z*i`(ruxXB1%zwi`UZgy^{8WSchRc zh%|x=7#n2&GO%hUffF<=Wr(mkrrZRgVCq614FG12j0 zhBc@v0CfYZW|$+A!?c!f98n-9lgR(VfRlzSQdZi3Ub0K@tg9Vw&ACv_S7$lvYo)LZ z%pBZsd5s11tEzmH7e~4*sa2!0#Nx0ys4}q*RCKwFvn~$46ME&FRW!DN0dXM=v5v^oG~(Os|RiCu#GgPMZ!C3oD}Vsn&UD^l_0aNKIBXR|9&!Z3J}W z^(zNVbf(Bpt?#c~=oklm*f*QP0Ao-MDlcBa%X1$UR_-D9%?LP~AhIK7m}fMDpEr5GsfnbQ0^BmI>l69SA6 z+WP^lOCmU_~%Zbk?Lk0I^uAPD}%*l=Ct*--F@Zatng3GRk{K$QWH;dgz(?Vwh5f zx`|hOdq%>fS4Eyc<`8rz1L@4JlQ*_vd>gtAr6b*@kVc{L9OZ*niN939&((AM)$OJC zIe6`|YtJ*I{3TS2zb%3qmfBKMOmiN@F*x*hjQ&%e+K*{c=-4*s$I0^+l6O-4}Do!DJ9#=tJy-qg@}i}=&1<;e$b~tS)_@fwcnVR$y^&7yPS%;o+u#3G={YB)|3L zY&b1F%^Y_7Xhx4iv)T>`|f5cEd4IdJpgWwBms(HY&lQz(UIkwmSH&4Jt0? zW>DN)FuXS~6gmtz62>KPCGCujyd0eU9#xs=E7546H*;x0b&?7O+FQn!r6_K`M?-(3 zBpNkFf+;qnErHpMc2ov8L}UB0<)HV>x9aK750&9+q!AR^e}zB2AO*}_lFnBV>E7=A z%B9=M7js}nD%VTZN#H1M^BV_&ys?f76nOIlY zV5(S61xNCMMXdA(TS44;grCUusZPMT5GxwdN7zrP;;o80_>@>S(DagVv}Agb>R$*b z;8-Kyz$6!I{qyuGAd5qPn`G1>R>dQVo^5&Uskjp-ZyZ*We)iJkz8?c|kH=uA$g^jF zB`KxMZk;k+1{K%$c}_@7JfJZKqhM`)$Cx1&)%boDN^Y?JK@kY+GCJ#zGQZIB@O*;7 z6mg}&>29CCyS7~kx>^KjGsfGyQOB17#})cJo6O~eVebng6b?o-I|J_k`>H%qqlSlve@PK2!K%a)zOW~WCvnqo0iJB=JiVkSdAEnL3 z_V)$JzfsE4SIhlz;-yjzm1~Xf0+0LG$E;6>vL`Iz{KoVi~Gy=S0!LDKLP|J6_9Wd~*)p zEBuQ|z%hCs4xHh9VTNS4zAUzI>Yu4rk+B>^*6&qf*kftKK4Z{EAE)5%zl}^~9xmQp zm&j-*fbNByHx20O80tPG2~W-bSL+k6 zEkApX*coCRYCO)uS^9#rq$!8F|J;Rzxeu2oK+4~lVk-6A&k06T@ryN_bo+yKdH|KD zodCd;B5viNnHh1RvkwqYD)>w4zlCxgc0aT6vVWEtYJxHe6r6rkkC1X)RaA!(^NYHC zVXosWLUWF3Cg0F5)xOYmte#YCv-3#|g}grpQ&1MmrpAZnu`#o4j>>xS?;|=*Hqqr5 zy-E_%ShVoV1I9qb7-%#pLx<5GE_bE&saFfv%brx*>Zg)56G8=cWkJ~q> z`Mz(~>C^1taA<`>IS*IvI?JLYZ64g8D#7jMEVr;5UAI&IWQz2&P4&E+W1>-Iv63{k z*5cI}3CE97*S+lUe_0(6KRFj*67`ad;mHk>%3OTUy7Z(3CbMANUoRH#%H9>yH@;MX zO;&| z4h!6sN`-!T${C-P16PSF0hUr`|q_CDhjmTX~?)?zD z+G?HW#aXg1yc7WL%EkN*##ws&*z)u5zc8$Go6o{OkHu&|9b8@<*KM=2yhw^?J+|Av z+R%vbNqYFC>e^uEs4ww-pIEffokF#FTOBAf@XgeV=2g_8y5P8+){#i`HS7Qsj?m&KLC%Cx*Ophm1W{wd#%mrEWm>bw|ZfF&>Y&x*2kw-7nc zA(7B>KA`Ab~=Z*H^PUlymB|6up#OD2e+#H2eUoo`bBN=YuVG7JgszsK`tf9($;|jBuMq#1U zwg4HcD1*qjTWMQ{lfwENdAB4*lUNGo4&Z(6m`Nv6U!=r(|z zGY}Wk|51!=ncF3YNY=FUhQrOo=2+3UpzK|y7g@6)gO8THFqhORw`RG|%$MApb38GD zz3uTnpJ0SUp#@8cSoeue+q?K5c#(ymj7&lh>z>SB$F-VjgD26TCu@l&Gz(a5uNk`@+taeL2;lb#LgZbe_&R zJ@;I#Ju5@vE?h)yz(3^;RM|S9|A?xR&*wT*e+MNl{zzZ{0_9%0WJ4V`)gm>hmtMwc zFwERLU)I2M;a%b{vtu|pqHD2A8lr$f41_S5y(dhwYfAY3sAgbGrc|s-(vyA_5=sp4 zzWiC1oy!_PGBit!CoTf?K`{;6YifckttG%SeJkVw?YHP1>jfN`<%b75hq|UBsT?%3 zqAot_zxDL6t<6WkApl{_SSUmv7qcVEYSB!gBT&_PvH!-c&F)x$?k)K3%)z$x zF!qeB4)zeyNo-_@DYh+H<$?Mhk=+yGsO*-U$Wv;ot0kzl>zMm;0^OI4*=$owK;m=V zI=_b!r?Kk_GjH1d^LMQ^Y)BhQx37q?w*@+!Go*t>)J+a*9s7kauFN4bL&pjF*&* z71<3vQICIzVI@x)M`>C^Pt?KgKS_auQ56Vp8T1brW^MB3hW9euc}eENdxj&c_i z-d>8?V|EJ4wc8>29v;(b#&tTserLX=*BoHwFlNQiCnuIo`;1Ms)eStb$!{o6JS!u6 zM9@R?r8;xdXeL;c_*&vMUorzj?a?8Rkx6>hXrT7dRXF_qEBt=E@(@U$Zi~cSKo0xk zUlrp&WerQsOTx=fN!vppDV1{9q&YZ1<)(9{(L!`4oPkaRzzYd@#6I7cdAMPFY`bE) z{MoAONqBtG);l}^pByfBj`Qoy&JPbpPsQbxFA9JqcX;bI=c`B2k_#d8`Li}d%AUTX zGle3+QiZQ_bwc6`EOWL2&qWb~ME0=n_UOIe(o_316o;@5pjKvp?(BsIdKzP$Zp}NW z^^6Y2ItpBoufHH)j^~*QpBn!0l-Q3JmBKKa&Pr}YX?sUbzyI)IrM;=8vcitq`<4gh z!lc$su{%TamOQMTN+wRJPUOtMTtI7Fvy{r5^oq50m@W_U@G#MKxCT7S0(MyRTw^xv z`N;l8RkBH8@7S=An~dNxXNdfks~n~aY0)M5vO6ASK-uQxbTOn>eml0q9O&ZG)^2&A zPh!1Pn}&a$goh)mF6Qpvy``LBqi8JH^cgrXOfYJ;UzH#o_fj{&?9giZGwFSP5`MMq zSzl}*_k2F;#iNDr-)5IvcBK3XipS`~uXGsjrmZSj%zdRLQ-v5@kZoRI0lUa-b9=oD z*4dU(Md5>P>xmX39Qfh0eta-Yje4-X>@ee`=vgo|@YLBUT@!-S;omSZnnfk_L;h5M7s-Qd+I03)5DhR5G4kU$d(7S!kIMuR?UA_9HiB9psEiPKZ;O^FVFK!(wK_m zmg#3{-G52DYJ{+8!e%L3?N+S6X=@Q5(RF!T#m^@I>^HhT+N)R%tQ5r9x7bIcNS9;( zS$RgxecxP$pO^Ns#X>XS5gA>CFYy)d*Kdd>WL9zv{8eg#TONECmXwYSTb6?5H8IrJ zjwOWA+!4$g3e5w=xQpP)InbCQv!jBw>tzx8qdXasa7N)mgLoaAZt&};9VyQL#HrQ! z`N-@o*>(cvSWDQyHElBqKtrVi87N1#JRW8$%O`Sh_lF2*1|s7Se4*N%0Gnf6rbbAxVa!chNj`d|Jk0bQrWMrjp3jVqJfV;(KY)G=Q%j_C4t zzXt{ke!aI(ue8@BV7FMCdR_{}baCfAy+;dR`Q8}?=0{|X3ltgQObBKbtQvcf@o+p@ zW6YR$Nnv4HNrJ=p4}>Eh0)166!w+mut#cF1O4`Q9bBF*H_G8Vgci}U>2?S{(Ez|E} zJ5&cH)58vE`}5QrjELX>rb|*KVOD6b8cQJ%44E!HSh$Y?{Ni>S!#-q{)$z0+1(@*M zurj=7Q#pMA{8Q(B%vhO4Es#eeo)Bm#3t;0tVt$OzvTOb#+In$t*M3$fx6HR6Pts3% zySI~D&8Pe5V^KryZYzbg)QSCR7e!ZxcA>{mk)(LpWsi`5Btr2Y!-r7ziWQ-eaYv~s8KwHFdS^z$=o zE>pl@B-LFY2`Xjt!iTq~Zlxu8-}TjMe;?h9N$KyN5B`!P!|P}GVR#hTpx01Y!uq=3 zN!h6&`(_Lrk`O6+s6Ft*u@iXU^NO(;2Tm~X$O;sCEZ`hK7$xl*lkeRHl%I7TdM<~L zXN(Hnh2wlu_Kdaz^p#(9O?{Ez*J}}1nSM4da4q%{OO`kAo8io!B`oj4L3(#+yUWG( z2Z`^iGh~Yo{e$QBvCBL&%MsZTuFp9bPl?pPr@g*;5jWcRfKZ3wAN%j31<$V9dw@sD5q-UDG{!QX~jki~6Aaj?(5 zINAI}Fo|PCn7EtI2`t5Mrg%T?@!!k7wUAq7!$KAb&txduenN&8Yy$4RgkyPLjbg7q zQUb7E)jjyFBv7pWz+`2}Ob_<>_<7*{y|o48r8nBy2bW(hkk2g2)2sIA<0iPLoUU)+ zs}T!2K+c!yDMsbUvHpmaHvSF2WkRLTF&DC8uos6rMW zLvy*5C}^i*J;I2B2!v+(W8%p6iUFK#VZNL3qu90^V>cg&f%O)y=W=dVQbtxoq(kY8 zDus`W`Ip<98liIGj{!!rsORI79L&*u{l&k#3z(P!G&2Lg-P&eK zA*PZd0RJcCwu3f08jlvP9`YI>TYmNRyThKf4ZBT31A7n+Qiw=gMLqXL<{$T8=swDB zHZ{NT84c*y@xP`YGijBRgyo<3XQ0;a$#vR)-hU%~j6JAZCcbt|R~1JxQS~lru)Bo{ zzpK+NV26cf2`zDHrTX3yLsIWze~z&p4H+ za&bUp;9#1^uah3h-*Xv#5%e4_hYP1iXcTP{&11`^FTx?CPfB~z&Q3rplI`v~RtcJqzfH6+-n8ltq8V{1T^J)U_;Q%!}h6H5v z!|y6OX%}A#0I>8${*R#xEFL7F^+y8g3#@#Z5UG?Ew*&V1g>qMy6p=^oQKhes^2y6c)5@8=8{K3$a`9ctZyzRIuhEFI3ycBK9(K zIUikI+Ly8Z=B`8zHTE_^D+YBS8FF-e;ZiZOMlxew$DBU@ey9%T=Hm zBEzw*8pSjM-79y`zDXp0vn2OaLq2zP4K9GOfuPj=Y|QbCRqge|`)-a2w^K(nzNCPrm3Q>N}o+8eeyu5N6 zRBil@ns(v?xxS|+yT5K#sEwXA&obXT=5QVRG?Vu+wph46=^@q@b`?~1)ma9MJ?V|D zSzeh8`GFOfdt}Rvp*TzNK90|$m=L|W9hsigSd=UYKD3hWpN=OKil`f?ef2cW=j*hz zSe|}X>Mw0NbosGJ^jukTM`qxmWRr0LC$D~e|K^P2;(*Dp5G@NvOiY}$P0NK=TVtQD zgXyY@0++LRc1Cc+f#0H82qfk{2K;n7ISReZ7~A*H!1s-3um|u4@w66yvhL;?EL#al zdgfgs*0z-Iq+1+iYW|vg68Pc+QGSSmzcEl`xhEU z%t%<}JF|iTMsd zlx;LzOCr(M1oO1WMpA7RR$3~db_^`ocx^UCHcQ>24x6L@uf4DStKy0J-%EE22q<9C z-CYVOASKc*CEXqON{G_Z4U$TSbX`HZq&uX$JMR51exBF&KX`t7_=UT>voo`^XU=(_ z_spKN@a}huZ?3w}IFbqvJ{}?V5LiWDk@S_NKHU7T|1O&-aqPr^GM1AN5g;rPt05>~ zR$^UgU2tvgY}d^fc4RD}lQL_;rzoTFR+s(RN7L6XF+oBvJNoR-KNADuFo>t9!NR7A z08a2CF8WPz8r46vkIFV67n^sm`9lT$ih+A!P?>R|*24O1s_z~bkA8{= zxemSN)BfZ%<;XY@T0EecA0Xr8>1F;x40#>STlF8fy4&I3^)5+drgCXfe}+u&@_iqaQK|68D(Z zX9^A;jWMSNUCD{&3=Gz?v%~nsG>$7-wmeqNVoyo}wO|y0#0rr(sT}2Pud!J8{H#kpF>$_3xxze-!8G|y`a?H<-!n7tmA9p$ z)xn8LdilGcmW&02OB!hxox)pz5Ws|Z#fdFo&ZPPAK$H6X+D|>p0b7k-DmgBIUJnn> z^CQvEE!|%3DnV<}Jhk-!MOjCo3A*S*m=M{iadfUmGnE6#{C@iw(=i4`6XyQ_&;Y&I zXkKl%&rp^k&IkXJh5ddm1N4(XvaVRG(XFUwU2xj&8CwhbqJXvCqGy2cUvP3iSw!eL zAw*D7qXU0rJ=a84<$BE`1AJ=4f^}d40rwJou_AdLO4qI4;Z^V=OpaH$B&`F?{>w5m zJJEmeP7%9Nl>$2P%oFgxLA$#YKK(YBbR-uyQ&L;V-W3pA*6b7*%;e?x!1AhL-F)-? zgO7PMjJ}Y*v7N2A?hXY-7bm5>qyk9k=-7MJm393pnlVbL>D>O<7zoGqlRa#ZeVU!V zx4RneVRhVWttUPpXCB8%I6V3=kg2WQP_3gqoQl9a1Bf+F?y1<5g%i`ShUC9I0+?(1b;mJRz9@ZP+jfFm4jUkV{=7&L4^ ze7zZ1g++|r|oL_1(9}uJ&cQ)o{ zS#7(k%><~hMsoy3&Gw7?K?6bNigOX-rOMGC&9vWt$g!NAn=VdxX3m}GD&nsBR=3TF z$#pGI&`cq1egl1i@4;Pud%JTfKX^~tixz&pK8!n#8)LJ9%d%l)Em4NFhB?km2zx^1 z#MuX+azf+7KZGyILrNN=_4Y&AE4Gh^rBPvY-CuR^q#9hwB^|d(UqoZo{h5F3Uf7yu z@7zn6e9cX+OEVkDmo5C48Uw@l?q!Q#f$q+{@fvD}E7ksmOfH{_mFzFzK~b^c8vnE1 zotsbu$HeS(w=#j~^d3kxdX;;hcbXJ&teQGjp%u(i+JT1+}LEekC| z&+k^)(Y#!JlN`vN0$QV`>%!lmq~GcXeo4{hqgaBN_)0`?uQKAihWEItlvD15w5L)> z=vv5DYsB|R|27XcVgUO<&UBbMx^#RVY>10Q$$4>;B_B^wza zea9I={E~<+5)*5PI8h(PF5-+_2{`U%J1KE3D*!124PG7W7{Tq(@bb{$<@qq*sw$V# zYez3}+m+a$cYIKKDj~$XGzU-m*Kzxq9uJWw#%(`s&WITDP1XsIIWMCKZtPgN?zMMyEd&DqhB8CDhXy{c@V;nd2WG5^QD^Mac-7U}3=Mkt*MXcaD&peHEO z(U{Q-`D~oBaI4?b*`W0HT89I4j3)9B6jUxl(&6nVGQfLk7#Ey%G1Q`aW861g4RKg+ z`ds)S?98Ze652a75k(0}@+fHoQ|1uTguzrm;^XE}x^r&-H8d6XG)hIc*jgqU8oZ2VwkrUs0hg9B&W;m3(5n}Y1T&S!X9bPoaErSZipCDlQ+{XEaEM79; zmL}^XPTSw9KTX*$es8fJb4&a*^>7!Kau(ZZ3~~1!meIHzT5=c zVtMw{fC9c69m5QM5nQBR1CGQ_-#eYrA}2`?NrD4}%Eb!O9(r5$cSAjMjDm-9db?tD z(H{*Ct`xaq!@)Fb*gR;cs*Z<*{7E6<*i=O~ z1?rlL&nQs;+&%S>92A@hyzLSbNAr4-1-X27c!DEM11QPUh~TZWCQ!tkbQ1%AZU%jJ z=H5aciNUJ|A(ex#i(Uv^H6fimk(ql@$YI3Y7-R4)cZg1tdiDhaUgO@F&?d9eTh(n! zvR6g~zQJ^9PEUUU<=LMC*UOQFPUVa26?dw!u@=TO-(g7WcyQ2oL2R)6HoR(t$&*(1 z@TYa1W_tvsDO(U-_x;8p(4m$ZeMh9Jsy4!g%MVnj!)`~=yMvxCb)YV_%dQ3mUE}i} znAfJxM%%vhA}eTf|8Y&9R?g44V73G0mt&_jRWuygzv`bb_YZm;OKRIm9v+eLx{05RxUW_q!M{~klGf|3$qdp6R0MdjQOJyCb8PP`OI23JZw;7PvqiN+S zAflc-c7FT`8gC3dG~tVcs161l8%^(-6CTKi|NQ_qD*j)id=CK(41jY+fn|qCCyNJts}%`~y<>@8W&W^1DOzK}HU^^QeMho(b5AYx z@B_9S?yeI^PP|s(jZ@RDS3`r^-2nr`6VNLC$5lybm?^Hm9OwugdbO_3pV(Oe&i^aeSgv%FJUqJf#`6l7DOyE^Fg78()&L)(OC_vZrSvjb@IUo zYzvc`4%&E%e>U-1`9l~H$Ak(`u*)<;|Kb>pIkD^f#a6l&IfFz z1>X@WXW^nk+GMz>3A1lll;t3M`O_W9Be z(cA^Gr$n3He3^%O{@ zM^QcEiHb!5%Ym>}lz(>|Ajb;-vm1Vf@aT&DPdsjkY245QZn>>K16)M(S2;33QwS;^ zO#Bq^+mD5P-5}`J7YbLA1O3)o9vR?ujB}ebl-94_d_udfmxsYxjhu~iseyEvP^)vV zwd&R;D4xy8@=T}YW1l(~4I?_!Lzr~bp?Ym0CN7@{JNFg%h+O|O&FHgUzrY8KtbzBn z5Tz!9DlKzx?c&Wyu#Pb|1-O0ydFxq&BXhX+6IBr}G0;uTo#FFM;6UjI|0gN5p;c-T zf$<^F6m^t6<)&DNZ9R3^JEv)Wok+BPe@?<~8%5&;&g-?mcOI zy5z$X6BVoyV+<7Uo(U!C=mh@g>{f?+)8>{_N#P`l8JSl{oY09WQLtym#8_-(Um0CZ zvlU!4ob_U&63L-&u%@&w52Pg0_bnAZ4+?q$5G!}m;K8UkHViN^;0hpeI{y6+tP#_h zh%n<~z%YL}Eox`y`~?xOfb|!kzt<`;Ye`CZ2&A~5URp1dRC#l}m;c-T+Sn7aj0l*N zT-|s(AaNA<^)S&GNRhoW`t04FfCa3CAXz$lggmG(u!sT5r@+InFQXX=s9+&~pGCO6 zir&CiY~z(ph)G$e<59?feg=N?1BwHATYF8Tezm7muYP?LLpP>9x9~61{aPvFz|mii zV`tsI-W0oQG}N`o_^j!Ew}Ab)qiMmL>chl&2qK zlU~S+EfW9pg*RVGGC_6|T#J_={RzQ3{>Zn9r%Oc8^@$80mxj)A`rDn?Sf1Z<-e?wY zsoP?TlXI_e$CG2U@`ZqBcN!#r?x^dps%Ub@vp&5%NayQC^_0`@2~(P|J<%v}H*WpQ zDSd>g6>T?o;x?d2W670yvH$0b4d1cunZrgZl4fy!vx2`$`eh`Y3g|v&qQ!<1ulm2> zJ&x0OSNx&nZ$~Hv87CZw=DKC_rl8w;<6sf}*hgGR^DpVERc4@#VwKZ&FrB6~)hLiE zWB%LIglHjbp{3d)uI-}foo^`$6(9VLp0I%n5>$q8+Njn;5(scsR+5~+dQ{SMHG4^u zcD0K~<&5UFoCT@FL=J~V8LixJ*8sYcUltw-m(?^`YpYeVnLb?zRcw*Il07A^N?bkMn2g1qUJ~Qnpx7@9jHY@b z;I`9C<&Ov3;nE{M$u#0BgtkW&+ZC+?%SQIg(5D~RbxJ%-(D`w2Bil%SR~O5O=hdfv z=C$|GRR0_z{XyMB%fnlK(lBtIYp-q=xhFm2vq1Bxnox5R{q+a6P!Y?upne>~S+4R> zEeK3Q3fyOUu>m;-LsT#_vyebQPcdc6beuv||`wQgHn7qWF zOw(;o`BGt4)COb-sS)Lxyw9x9boI7>q&!j$p|hUGJ(pa)o%L4(GJ797Vv!G36xoxPtFu-s(P8!I+K`M#5`+LB z_3w0{aBq1_vNDqEZ}`CZ$WC7$IgCr<^USLga@fSjySH_fOgTE{mQ^txc}IR9!F z#1eYr?bJn1DS+`aXQHqXU@oycGs1p**oy&t3rhX$n8%5I*la7U|Ji#E4Q4+gtgGZ_ z>r$uZq2f~lew}gcAku|g@G-p@8VPhyl9L|8>ow{**GU-1Gq3j}~%)=WezrK|Rl7m)Qr@$~j1W0;`9>U^lNljR?YRo&8cw>i8V zlTqSs@;gZnmG8#x4zvYo?tFn&8S^e~$0 zI_Le^x(%pK(;lWNyBP9@Lx3q7EFkQc0vt$08H$?QZZ(m#KFb-D9;qIO)+R$8$48NZ z5UF&rk~wj=BV&@(aG7>%a6jK5L-epeIPH5{SE3I+09?+ zF>m4vquNNr{E%1jWz@C0Y9yC`3-y3GzAW9b7)=3yiKF@jE+D3(-#6z{gmNLnO{Vb# ziFC(oUWilAxrcj3WZbt5i17;O*-M5k{_&3#W!+Hjmx2CklNKo+qsXovIy-O}8=y2i==#8}YeR z6pUhCy-cZExQ0qr`4I%Sf6j)cPu2WrNAZ5wjw6HC1pw8KxQSE=CfGrC_^aO?0>w=M zUd~a<7N92bOcM&fmcPjLJB>}X{!_x+u$>`Ub6sm5EAVLwptA*%nx3`mkG$oMAO}2; zZNJ!}!q^iTpA)8TFM7`ET28T+VgvSfWod~rJi!@~<#}=E3j0ddwPbUw_c6CxI0&-+ z=lq8K&+~8I{}IuCi3|5#Cbo;i2h`R4-j||FQL;zezaYPJ{k#~8;*^ml%7WS1g(d6J zI($I33UC}$U}4q;jP;mTLJ=lwe!b$~^v}x9H_hY#&p$PYFBsY_zoTN{_J6}xmxRPU z7evIYX$LKl`tvd?E^k>&gXR?s69eL6-i4N&l0gz)TkG_C|E?Tz6IIeh^~xGZ7^gh> zCN%IssxZN|HWr@4zA$u3a2pIJ`zqQZ(7EI05xA~ z#;eM{ADOb_Oc!U$hE0KSh$8pa9ez<)>|AqxVDC=qw41N3~OFWU^@%o!%~-|`kfv-@f9B^Yv>BG!3StGd^>wN&BUIM>c7(ut8V6l zM~!9>+dpNcWHM|3RLzS&1Um`ZWBLK)37(T4EmTz&4(FYY%0zZX&5>QsIT0JfQ6 zODE5hYzT=U#tvu#z~#phgs8NbqYIJ{F$TRVbeRi{sYVA(Z2?Di!1B!Ob%AghF<{(S zH|`SQUR`+()^!$6md=I0*HPU`clT_a9pKds-`tRi`(%sL{UA7 zOnHD7uV$o|*I?M!@40G8ZfG@eRwARM(k_|_@|p7aHLGR`a+)y>fRtrD(>-Q*42o*j zh2(B#H({zQG>2mA@6LHu=6$b?XmiCI^VCSt|58OtQ!3GOdJ2ELid*AVv#2cPBL_Z} zSR|1IfA3m; zy*hUiIQ#iP5R(Mi8uJ%#`3*|R%HV1N>lP|_A;s7Y!HJVlrOurPOW{|hL9ef@FRG=k z2=5ytH&wlBr`eL-6Wp_e?lmK-FSdu86D8f|ek1MMj_GhT#m+B6`8a^^?o(4QiTtV& zblBb|8|09`lehXkso|v@?aymTem^VQuXdb8OJC*@nN<{zwbJBGIN_9KpPGay&_`n^ zKXOO`dianfR*v4gd}08)W<10PS-L`sU0z9EJ4A}U8WIhZ-Z38N$~qMT`X%BmpNW9B zi;5j6pWhY5QM0w?i{1V1#zjgN@0(%k2YoEQL(^yIs*la`qxs?9FoCQUDmA9;YgbMh!TK6AG+R&cIC{r=mGzv0TSLU_OTNXd6 zT82LzX@0nOrqu_`ZY*KgV?x(=*U-h*bC8KyIFU z5q&&Wm?P>g78>jo&n7lnBlB_lh81$-{AehBrS;VCE)Tiwc5$V)lSNj&OlLT2GPRv4 zKlq?3c=+?W(dO>6RPvYv0l*j!u$8n5FN;5q82Bm7$gA1^VOXU>8jSIBJoX9VNYAoQ z4%B>1dtJjGn}7lrd;*B!6hfzTzS4>*Ubng%AvXSIF1i{uZA(C>z5J8TQ6#m`Qj8{< zOy@@)m84F#|ocD&4owF$Btp1ocs_a@pfzhe! zt~Nan09DK`9vUpzb)zc7E?khk*;Sla?jGio6-H|hmY@^h;IhX zj2{())58+WUuAl>9Z=YmdT-0GKv2j++<=33MO!j7_pY;}>Vj+Hqy&%c=+{FBv>Ta{}zLrvfHMLXGP$`vJ z!H(z0g915)9R39qh&wt89OaOLutvuWRq7$_r;^xQyf=A6Uroo-~kFB@EL)o(5}Hmv%T6QZ1^Jd|F5iLtSJE!gZNj*&~d+V*o(GhNXgxAN4Pvw%XE>BjAAC0T0ZrFJ{ z$bPBqG27P#EQ%k+Bg*+{#hic4M|8$$n5Ikvhk9=3QOl-Ju!hr~ z0PuzKHU9X1448>{1ga1IEYsrb(h*aR^(2aFb-naO@L8?pc7A0*`E&8b*j7C z@ssHL>pP;NcWPGr=<8P3_AQvVMm0(z`pBPyfBQyyRnt6jR&9rFUraI4-P^WoUB;;( zOdv&&RCV9FQI!`rfweBgY~;(R|BQw=s_7zU0UiH2Rq^xW^4st?1s@==>LaxeCFAS3 z0R=nn7oaXTu|O0BCWz~1+q5p_uJdDELG+n$-2aWXNrBKPAGOh8`tx78Q;eF4T29Ma zc?;5zB8&!EAyBB5`JDs77v-A~tP!bPuUT}Zw zzSiHpy|U%dlFRzl^LJP8qV&&H3L153`yCoontA?QYh2XDxbm_C85Q3YnXX>p0_lvU zegkWOC_cnkdH}C`-D>=8x$JG2=%Gppol&gUB#Pd(B0FdWpSq_ac#)pEQ8;Q2xpQ7` z&u>rb5>vBST!p(oZT#_2(o2=d)~N7`veIF(fVTbk&SRL^R4VLb=P?kSarWqwYBtG! zUI8C#sw_6w8DsHW35Qg<97vqhHBeeQ#-R9Onue>s{UA>-TE=(~I=UD->M=fTC0_b` z{&W~(8{-%FS1w_ORBlKn{fo$k8~tl42CKMYcEFL|c3$#Z^1LlxIc@2Nn+fz=#tai0 z4BeO+fYIheeAVUdvD0zUR6!Uawj4%lGkeTfwy7Y%dFnZyjV5}jAGaGMi^WspXhyM# z3v1NvF~;P`#2snO^nk?F&{duBeCguN;sA%g3Iz(hExcY#oLCn^&U0|J!XW$=^js-f zJNa%(#Qd}}?hG@cyrh4wVz^=Kimp+b?+z9{U`6lIPA->fd>yR#AW?e(KPc!beKTH?wA9^V^opwhbvCIofL4kYCQ zG9&>b6WjPD0XwmQc(YLT4i`f|jv>kT_Mx>y1HbbhG?}A148vELOS8FZGA^UVSP5Yb zj*2Im@=4E4c0;7=cI5z{JDwhpPoZpB4^p!M^Q+;cld{n9Pl8<(H zdc)gUp)=ENYp9Z&6W!t(Q#+jJlg%2sVV>t-a>E_Q7>S8!0{*)JgeKneSx zrjWutSx$~&B5KX<)YDYdH=S@3pG&HlHnGCprzp>LMF`K30_RKp31B?bALif4-SH(? zru=O*ai1Jp?TrhMcu|+7E6)RS2IlH5<55h!^5*r6bzZ~BZoY^Z{~3e*lP#zxN?m408GeobYXbU-9H(9^{zRFVo3llGIvSQw3;S#~YXtLTcZl*g( z_^<-&H<^x}ATy)F;SKA{vhBXs!cl0v(Ol44Y2k;Z6v!p_xo*|uSa{+~9=`<|qFOrm zNa>Gt5;w}FN_4uL2)tzXA_CKM6__{(_33Vvg2bJxg}%>+UFDlSk$GiS1eD zNpAv{dcx2LZqq9t9)uJlZMRVDS(Bd>U)T-LoG6;MfR!sV^Juo}DMf07tSmi+f~U!& zBw7P}xM3?lBX5ezYt7?O`HvDlz>UQQ3XF$F%dn%_eO2}&1%`cV+&C$|9Hc!m$pfh| z5GSG3wH%f#UjMZ%;Y^OaxYx_72tf^pj8n~X?1jPe_W3MC{OAgb*1iLxi|xvrVL zyz%6^oY|y5^JyTh??%mVbIfn{*~y;(*H6%E%uL4x^u2kv(OX{SO{z5cZ=a3iDJ?pP znE_My`q;}N5MDhTrjj_dH($Pd&u>cmTuHL3i_C0z@O%H&+}Zipx@p34!xufhB{=%0 zIW>NSp#e;HzZl0x497^%h$)FPNUgw$tZ=QUK)b{Y)( z#>69^bkhebq7i7j@EtuJIh>~{_)7&!tu1}+=P2h`H=dp^x%LyvJ*R$;PlvSK6$;#| zD2)-6E6En*j)KIOz7n+NaRUIU;aX+Og*;&VOg}`N-Ptf=)7H2MDonIU2JC7qzB%aA zse&ISCBDqa3=3dVu9lfc-&r@BZK6LN`_%OUG>Hh2HqudWTMJr=r@>+2hw}^fKTy5& zyCRW0OE1uCJ#)xZK{Ml++^>!ba^m%Q&#Ve7_}#Au$nl9P+?4IfmbEmZ!{>Rv%Yc;c zWfOW<+7L#~+%pXAI9veXoNpcU3Tz|kmrPINj|Z!9;mCL>3)=K)g;+odf>qgCP?C_@ zi{B_gaUN7Owq847i|Z)~tr&R_;xKedm{Ok1dXIbX~5g(sd58RR`|-X+H>haduJ z+d`iJY~A{4soj962+LyS%Ex`l(R z2;qX!)*=7e*5-`VkHiyQhA}7D*1U$z?8~ih}b}YINkL1*d zI&e9$jpqzd?OQ#1EBlp@vU_D7d9Mfn6-v8gxyE!+=? zQy`eD*?S=n+S2NA$)Q$UqXvO29q9vfyf;NR`cW%%bEkiI6N@se-h6rUP5{I9`m?~N znW8zO!VY52{3aH(ijRv3XWyZyfImjNcijjPyJ#l#Si{@*qjXZyT7;cqtMS2snbl~^BtPAuNMi) zy-0qnhR2^%5B0dV9rvK?muPbQ+G-XBhBf@s3Y?+Mo&0`vcum$XMx6Q1OQj|0F3KqMF~y+Ql0 zFqk-Z(Ybk+@YDSz0G2#Ji&vR+@Ao-?La^a^FjXm4YDvaTTd}SK!5)?r2sYy zLd*NVT{MuUOjbd)zG&H4L4acgjutJ5{reT~ipYRJ1otNZJ#ZwY6Vnm@nyLW>>wW3< zO_FHlzvKIrTiiy&>zwQRUQda<@OtB=?@fP!vre;XjwC>Xb#YD7KKWPFmW-h}yuof_ z*QO#fP?Q*;!43!@x^GP5e91R52fQp5+so z$KKP@92a#LV7?^)n8kw_Lp%;HQ*C_i4`F*B@Be|14o0@3=~+7e?`gR2d*DIy?}{xM zc)+`0jsn-0`d88%tk5DQdy$VYJnFyKbpKAGoYd}&@KNCb|86S3FXW=OZKR2$YX5h} zm=)w(J7v!tIK2O5P=Y`02PeEYIN|%}c2R=pKi)r7OZ&VPnVNbD==D4^Faz_~|GRaO z5SP`C00nNkv~b@&coeV4`MnDl#oc;TmWuyRF5JVt%Im!9j=2+&jkTsjXDZu$)(QgD zy@jAx;rZOfj_bZAxU#o#e`)=BD|I!Z+9~EjqUHL60s=n)S0`uoBI@s0%E7lB<-v^s zZ}+;NHKLp6?7l8JzQ~oL^>xP7lm-2L&U~fTdf3Rg!8<=n)G>2hpm>-76Yx>6Qeldc z=fr7-w@&%*GN-CfAXoHThY6Mzum5$~?t-GRi0vZ z=`Q`^nSvfI*N#vc7o&QI{rmvEOe@4i7dzCY!g~9xpkesEV+lWi3QX9Cpu*fC@C=RW z!wiq6mC_;vR1EN(Yyb?>%j(wd#X{2l*NeqQmuJWJd;9Zj)y=8#*Qjo{;^OZ1@mqqe zYZ(*`It=spG#*iC6E4PW#hj*99DhS zGgMMU{cQIa{95&a)}yIGJyD?Y+EnJeyC} zZWL!7=2u%b+Hbtq=kEIF?FA+?_oyR)1udT&-#xN2$?@hVtNT^+cU$(iN#&2h8P%>& z@GdbU45iaU2|^*;dVsz_YqI1`Q&(WVr2M>Y*41%n<8F4**)8wN=*QiG#1n5;2mq(K zUKc;R!R%hRU2Q(Q5X|^HC|S3ycG9)d$9Su&l8UK|*K$rG*kbclLij@I_myMeN4rnJ z;lmSkBn#>k=E)D)vdKHB*dd3-8ocd!^Ir2sS{ipihrk|1?h+uk-3zk@i4;YHFKW?cU_A@-QokkPlPj#qOr2;ZC zy%GKyymZ&JDv?~?e09wnJd)j-`>T_JrnvTP6=GqMYpljyD)lBm(zNi9T=OvRSyxuO zh#2|_rP1`S#!?n}!r4jpyZNSI*^W_qzbP_wSF1C9Dqvz(ezs5XqH&zts4ADiVywCJ z-SLP*E&d07#?=)jzsCiw7+d~Hyi#D7GBTiFH7SiV{9T({zmF;29M>jFa+c5{)n|6k znS&os(q0J66bnVqcWG98DX}li>V7NzIzuKvrN5Tku|ATnx2J8>_3`oU@9OKq`i>u| z;xBw6gGQ}YAQe-WLpukXcIi8QhL0L{C=ABVri%-C7PPg+X??fi5;Yp9Xa*|P_O)E2 zwZP0(t^FhJ3LfvyEaF-W;^(i%9kwDLb>wI3?nI5!-ksj4M?wPSThwg94oj2UKuZ)d zimG!;*{QpXW@Zf*))wioZ8P6ac}4r!y>;Pt@ssneu!x=a6FnL!KD-@1c6z+=DxsdS zD5e!UqA)~|-jR*o1-GjH7Bi*e+`LWGSlbw3P(~;y>3R~U@F}TP-^DI=kAE_Ao&eAY zK0c4R{>G`4;Ws^C)LgDW?QcG%c{`SoaMFfck-#t5kVw%a0v7ZKj6xPBj1m?u$}3pz zGH+15Q}<3MChd9VzMl&j+E?yWeoTDkYppdqf7H73;Fp{YryL)@5bB@j{kwAq+=e+4 z5-tPt#@ZAV#k(VL7q8T3UN@7oF?f#fn#Gps+r{H}!PXyJ5}aQ!t0|Y(jxpMe6?mlz zQ{1}hQV5O$Z|i`R@XMs>nEpt;0I}WMiTe;8wey9gs5HfbdN)i zm_p&xw{u-%sg5Z$@5-$@PKh^&K-*GGpC3I`1JQ z>oY7i`&#AdIb7x7Bm@K_`^f`|QRYJjcU)1Bt19Tesdf58P~XF_Fk(-I2BSCwPtB9M zK32(sZD+A!jGlT$hun$bsY7EpQ7pp1lTuoE3|lUecRNq~93eTTXEZ z&lzn`pLB`2)sP<_!8DH@A5vajJ|IJy*?DJX_p>S>kNW9b`2*scM%RK=gAuD;Z7Q`} zwT-TBj9|6;;ls`u7t0lflVsz_6`@4mcet9zP~^7uT>s=u?N) zZq?F%v1l}Ux75|vBR1)yt}ZcwO%AMwt;v+9W_~FuI^8mmAaryY|Czp1)O6gqBQ5{| zuxu){6V|J4&)#{g4tQMZ&TrVbreL&Vkpl{3URjrO`r_+X@2RgHWBsqA{rxlT?Tt>l z0YJp0;t}l5Evf5$nzip>JCh`X$jt=TGOpX2qgiZ!(E5% zEi~<*=d86LR%t*uW6f#a{;)w3V(gZ=q&Ao{aCR`VH^75Y_dEBock`H@Ke~u5f6n3$ z3_`%cN@VCIy9D7eTDtw9n?0y&7^-|dz997rzW$j;IVc_JnsvS4FzUf~oidIIA$mY~ z;sftU<{Y8D6O)XZ7S@vjgkBQ^`ypV26T=OBPkPxc z4}OIWVCt}iRIbr5y@cs56(%x5F6V|wt56dbz6GR1N@m^a@xy9w7G;gWaQW{C~6MGdP6* mGjaa!=YI<1e`_4Nkq~BPTFFky`d{~hE-$MrQ~JU<;Qs+zT%hFu diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png deleted file mode 100644 index c8b143b232bd394e11ae6232f8a401ea57a7aa3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmV;00($+4P)L(z(8ygZ=sFRxuRAha!(Np2G5XJY7LgCypOQENBN4cv4*0r!EB-`d|`F zq|hIN80Fo<8Yv#+m;M^z@`LPaHdE8Jhq=Wk`L}LN_OW2rZmC!gr&oD}WTEOk65SqLhD8W99g<;;Vl7ap fdT{v{AOEl43bEaG&wF-y00000NkvXXu0mjfZPO)7 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png deleted file mode 100644 index 28e0aeef6e555233fa2cdcacc350b0518e3f51cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmV-#2$1)QP)?o2k(&m=Qc&?0kq8(yF=~uacu~*?AAI8hqcJ4L#0O(y z0tyBb&}d3P6vd(#Q0^3Ii@m!o+soc}c4z(1nc3Z$otb4ivqkXBc5`Ot%$#rj^WV2N zxC3GPuL&4|8fmu!SUcD(Q0h{-8sWengFqA_@yRBq1vzOXx}g!KPSJI%KMDhW=<-3& z7{vL>Ag2X6X-^?x%vyl8lEXw2IQ;NrphTgQeCAb^e|R1-V?sVo0vQ&1S9 zz)3$CdRK{qe4+^$h(IU-jg_K-P7dUx(Z^XR4`Xmzp|$|JLqy~Yt8Nu(pc>2=W=(G| zbwDr-F1s08xuGO&`jNbvf6OZsq$i}%st8eY90{9!jyCcwY4qsh92pFl4m35zP*+A? z{`_Fp6**}PhbBo6MFG7wmmuE53>qq-xi0n0U{ta028S*{YIZcbIkQ~!EVi*Q6!srA{~lDPZ)%7j=P5>j0vDO3O8cn;niVN zsnY#*B;^uN;UKwYA)OfzVZMnR12}{05BbpO%#U<0lvD*rTaz469W9-pmh%9}&pK`?{;SY`Yhb|0D z7|5ygD`tqnkD+4D+GoAqLl1-n0s#_G8Z}5`@*pqD#JNiUpzLS2o)Eqafv$0P}eJ1ZMwC9FDXP5i(r4+OQ`LDInqd|iiHkpk(g4( z6CxFi!v&Hjqqixs!zc|&=u%MFg2n@F!P#^A+5D3RYLTcU|3ovn*fb|`JyzkERguqpS_;%WRRK$Z@8)p<7b3+7T5$Qz<_k#bDYquIJ%ma!tANBB ztM29-PF7?@xBQ19q1&w=yq;=YZ9CFme7lUvnlV>E)I47njwi z51Xei-q!Hs*0$Z>_5Y5C)ogQkBB{;k^7WMDx_&$~tZE;yy{nmyJTq3^f z?C0w1p#%jPR!oupDq=)EUODmpf$kHHMK#FynK|n|S@l*+>-P3>G5HL}LXRJNM>@YJ z;Eg7@_qcGev#_PA>F~g5;ry0aYw-I>-|yb2M%RH)s@j;GG?q`vo4-bas?eqJo^8K< zSjm>Gt6sXJanmcm?oM6h&-zq~+;6&1K0RmcQ?;uF(l*Ajv34~MQ1&@iQavrFh$Tju zT8gNRy`A49={26Fo6h{A>jxzL@Qf8Mi#^P94|tZ8yNU-xH;xRR(YzA8iZEFBJyr0)xI;k0zKu>bmxuP@lVzIyqybuH*O+Xl~H3k*zb zJqokIWy8$-@cZP@Wj&Lx`uk50w=bJI|LvydfSBM>y~{*6>5(b*cy3n9qc!*9;InJ3 zI&VP@LDFtV!FViqsOO~KmHe{e(g^A2>mOR}S+uxh_Tq}Uc=++V}%j;a-kdwyJLx-T7Jx$F(eB4D}*GHER?)&?= z^s2*Z&x(r}5!0kcxnOJWsV8bz?bV|j8cB+r^hgA%i%9U)NWorh+wHOuM~;Ty8}N>B zvN{=kMN8`rpRo`pk&&E~`>Kr~}b>#jE4J>K7=&iKuEU%)*uN-YYqu zqk>$97^l7#gQxkQK#d_u|9Hv)^SfZGV;{(2h$FO9*cqfrI;}?-Ds@IONMm9@bSTfz zWGI;$@RTc0+fiAQ6+iyUNq706lqEHpO|5#<`M*s{gt_d7m`?cVzjs~oW}TLk#u-AR l==R3{=Ku0;d)$$v{{>7K=Yd~LktP5D002ovPDHLkV1m#o7Bc_< diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png deleted file mode 100644 index 2859734ccff640e2a13bffe4bc3abf459ff11a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmV<810DQ{P)@7Px>vxi!&CJg3tXBLuFf-?T=QrQ& zd@~~6kBGTzofAP9tRe(HHxo}|Dvr@v%qHJ~yS^SD`oIC{EEW``GDs@OWZ4qY!($kj z`d?g;hf@T{Ew5y=kh4f+P%Xi2N6?L*``P5%acz1i2|Y?QcvMMPX<;}2*1oybDp%so zv}m+;a>@O988Znp9eQiC8;_z$$r`RzG}{wRVLFM?SEbG4vAY#6I}$RU zL^a%k;A$xh%zzPXz1w2>IUUHwHRI@`fC7~qS8yKt3$|5N&Q}T5t z6mFoxnuac>HVLgBJeovO&dvC$u&N5R70h0eVq8O=IYih6tn*^{Wp2;M&G0(VP=n5g zIh`$jmMf1%g&DaHi-&b9ia_2>x=E(XaY-x! zTou?Jz{EU)wODOqb?UCb1|MF;*gW~<)Eq+Ms$nzblDI9HbHG!HfSo}}D4H+R2sN`* zdo9Hav^kXEmsnx zGk@Q_Ie6#RjuRbCA%|qUJ=}Bbud7%*Ku6m4x7Dl}iA8tTZ#dd_S!b{6oXSmRj8?}p zsoRm>&FP(*NV#=i%>%y7#TwF*HBXHP#oCHD5mkhQ3pxS5;S3F75pD zMgN7zoue_%Zuqbu0awCnI6mo|A?Vsc_EKE-pq z$O#W;Bh#r@UfYW9iTj1y5(VcXt&0QMwI{H3+sd`4!q@MNhy4yuXw{}~+fUNcp`P;t zb7NQgeF{9@U2YTM*c zq=9NPkzE|r{*|Sl0vVI@dhTz7Y%B@SnSJi)vzRIW7g20Ky*!>SyVG1=10gCq9c$c> Q_y7O^07*qoM6N<$g3oB-(EtDd diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png deleted file mode 100644 index 3f987be793a6b767d23446df626f1eaca9888a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2101 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 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png deleted file mode 100644 index c62f2d283a9ece9b562ed3f6d48604d2b558e842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2861 zcmV+|3)1w7P)7hz(sw9O zLRESwRO&xXQkp8o0i>2Tt&;`}0SXBi$A+-B*Ji=?dX2AL@7?ds?9R^a9J@0+W78y` zhSkj5**EX=?|$zMX7Uk(dASF$)cBY%2fLZL9rVO%Ce=>4J^~>UjgxSkOoufdoemHq z461w9lllrZ{oR-%H-f|)EOA)+L5%SFYL#q(wH|r^LqX!7BZHG9novJF9Uw-yzMOuR znTW?mjD#d{q)0qPVo4HZ4xA(lb-cz+kFFLf^Q+^O{M`XD!ZxO{+(K4JSa>Q$X-C*2 zK|gVsl6V3ubN?(kJwm2J+KjpcNINa7QSvK;f!Iv+;E+g>#RLf@$O61qLWDeQWd9b@ zJ3=nsE@`|aLz=M3pr9MvTxO=nN*g5)v4i#k{si$HO#pNWy#c>3FoD@i0ydVMN8FBxKlttMh%^tN;u4b&IlfXw}iRP4akRb()* zT=pzRxVnrImNsEEfWfyo$w(;8`JNhbYFN_;6blKJHc}C5{3!I<;2<~VsY_#XxaEKZ zVIBBVSd7GMATg;3wiJ*etOs2tfXA1UEs>M39^gWBaM{X?B_s^0cVg-DnMEBQP!t4& ztxW!8)PXTlv6&3vVSUP}js_a%%WX81J@&rnEds*wrLSthddD+T#c1ZD+CO4fD`m?9 znJma(xGB7AsZ<)u9Lm&*edAj9&Qy3DTNYK~k#9-7G?bYW?_5Ot>49=9d1ym^qeMxs zzl7nLM?={X;_uhA>zaYxOxfB5L>v~;+jS-kFXazstHpm@*EofSi`}!H=E59YmaJYoD~)yZob&*rVJqGcur47lDw(+4xJ%0oadmasa&R_9{m z)*_ws;1G_HWBnQjUN|a5T|OXNJDW0*^u(hCw6kGw3`WR!B&RVLBClRi+*Lt5usX*r zTMWc)&0H9$oRg9zibfKKNMW&g-U48aB9yJd@$#cCJTt_bXMk!5D>Y&G##ly} z*Qaz`Tk2@cxrDD07IsS^;WATtb`EH%B&W3LH6I>lPT+N##Mee-Yg@q&5W9$S30GN3 zFq#eq=%LkJl#rpHAP`BAE5$8GpyK1BPN2*z%qj>gg@v)DTba}fBP&Q4_i*}oZ$0^I zUx8TN%B;?DfUmNf#P3`Rl?Ey;G@WD>+wG*%lUXt3vn5Prvumwf3`3@YM3RG%v0f>t zBCI^|fOgf`=u|rkl;cu_VTyUahcM;q#%j7EA&RzIvVzBOl_MvG%!4wOW}z;ZE;DDV zGZ0277IFsL&)t)K3hZzql1@btU`1ztPy_J)KrS<>5U+L9;3OOo$pWP7!u@iD?{Chs#XVJ-bRWhKq0P^y^`fqvY^lozDt;nq<`)UlFf1`)NT9(%d?ETs zNQ|8>g^%TC6(LV(K3^@N7hn>|STBAu9Hhp)b9GK438g4%nO?47(r05Dyq7zp*sx^8 zc8;yXL`_$iFnDZKFW7Z97&Gh^J`c{BgRn@Dg6vA5ZaeX+Z8R*i?w4Z=oosZ7r+yF} zLaRTMy1;JvrfV^X6bY)J8(|QD2J$EIFz99{)m|yUhao>*6q~K6u`68tku+lIjY*{g z(GrPQkWp-#ku*8wb_Nl~dm*D3UdSIR>&BIV>B4Ff7UX(vF2!HD)<(w)#fDWEBO=zq z`Fa5>Sfy5(tDVBkN9WzN24+W(BDi>ZL6|h7VBpO|N-`!9X_Z#?2#tZD1;Iv>R4)`O zGoho`eG*SwK>4dxRjDjE3DZ({iB)=80P$uC=c6Q*-ru})v#X`WRnK0=6Y;A-Z}({L zNN6(e&W*07O|B-Xen#gfKbRfcRo_mZoJyS-JuBR+`an&a+fF0%`N;u)SaxYJ8{rj4`_$^PadGLqr2j22u`ssUr?3)?k+Hu?Ww>%})&!4?L-+JfQzr61mkHdw_ zy(gdRof_cZP-!VU^5Bmg7JEFI*n0Ho0>k10xdI6*#Fe0TCKjr)lx=V|Sxn~LjUAnJ zZC`%#=RFgbi|iqqN_3CB{q&~2IRAW0S03SgO`TwilQ+iB-;UfV&{sUeScyt2bJGWV z5B1N|#ldQ8#ZNx@l`pOTjKgd{yz{#|PJCl3n&UQ}JNM$@5B?_F$&sO+G~wp1A6)zc zU#p*5vx_}>$@{OuqmkXbuCdb!L}#Bp|C>5T!%M594+#<|DC=uHb36D zqPE8A?r^U=7rf54*VtSgHJfm<5DmX^>r&y4l-Y2AnI$MK4u9{$@6R{fXEYdh*WX(_ zVc?kW%-1*X!^uMp+c?4xH*7;!I5{!e8%@RKe$PTW2on*)(IR>*grU%ccjo50%BHRE zwRvB)R@8UZv~icdg^AIH3GVVQLvON#q18XT@(SDd#f(0`a-#@+COl~=u;GI5a1_E= zcnXA9Se@lY>s&HBFZZ=gkKy1hpTBYh2Y312%<$RUeLL#fT3rq8m93ZVc$=Lox7E-| zzsrH^ZwLBGG2kSupVN{-C@Ht&LWtiD90OsT>}lu#;l~EA4j}BAZ#!gUg-KZ^cl(KpS=H8Gmg24uuXfFMhHE)`EmBV+oxvXv~Sio zJnLUwQExTTiR=F9q4(#;)C@%dVcAe71*DdrZP@?ghetxhBpFDun& z+36qwVRivZtqsQ#@iP;B7-F~YbS$NQM+l^c8f7yXM0H&7@eJe5f;Q-#+M ze>-sOb>C^;Pw%`t?VV4EZ0`sEff>oS(NGVIbUt|e(Qx3U>;Eh;2qBaaWnrHy1q-tbXJQWa^-Ff03Ma*P1 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png deleted file mode 100644 index 9565dc1f9c72a8f8b2fbb9fbec7a10897d44e37a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4009 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 Oq9`k<%U8*ofBPT(#@0~) diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png deleted file mode 100644 index 9a04de115e58271b9f967302a04d314a1185e7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 zcmV-&3XS!NP)Q-vbGa@?PS+puh)CyJLl}q%gY^UeRC|2AixeL!xt3|T4 zn*Q(b6ED+Jkj&&rDoYmGmduic3`rYO4+iMAyN&YvG`#9m_2(q!q1~2mJ8Z;lCxODL zT#nL~2rry%r#{KD zflDFe8f-3-&XSoFnNCuwuuM;EBRvBvueU0a^-Ki~bk*AJ?WEB|YMf*=K}{Frxw)2H zjR?BC=~0v(;C|n}3`weid$#$=P@J}5hgP2?hggz;*G_GfvE!*2bV!QkNReF~hGgYP z!ohI2f+%;zu~O;^U&0Yt3ogXXj)>(5MV%=`b_n0a!tEg4TWGL>452SXV`ddpB!kR_ zSc(Le#8fhGa*(Eojbp(OF-DLDobbcQ4NQ^b5Xce1tt7_5TjK7^fP^U+kau;`!wOdh z5XX-v@{t`(PDrS(BJV|_Qvw7ts>rdDlEhTJF)s(}2+#!rWH1%g&?;i+kz6**3}ZN7 z2vd<&3JlG;vGEiJ?|0CcF{SH=^<2pE1_7@KhRK2qVQ-L6ih|PE5H{3SADKXGtQ+@N zKwan3WGq1?$q|VQR#c=iN@LUHr3pPU0m4Yu2WXwC7CR%5aad+dDmqlK~;=u=-Ab%7JEaMtZS{C+)3rzNO{cYDxQLLCz&x720@G- z#W-Pa)afpc*mS>Ws8g+gRyRX<9i+;cPm7TUAa2&mcVx6yk;k{?$Bl5$I2eLzbhgO5 z0ro64Y|Oyw)R07|tBt+gxw-s{+#WO{iL>2Xqe;s@w0Qi}HmHSVc=BQ;J^?b7HYfyV<$4d*P5B&L3ohulceHo{8? zK^Z8QBu5CxYFuU>A>qGpKp>cuk#ptLJIx!LP=uwH+aY>n_YE& z+04S&NT~y~y4EfC4;K0Zdp419G#?D^YL$aHOtv}`?pMEzD!RrKz|3)y7;`7wqJW+> zwQ#D@Q>1lp36e0OoVWyT7PD9BHXwO3U)l8gh$hM1NqmlGuzaRTGK3~enUUPzM*9yH zCK9+o_)2>NmDY5Onvd2&1*&yOe=zRx1=^Mz0DR0wpSDJUJal-v;Bub2Pd;Vm_GY;S zr^=KhVONl0#tNSX5N&Sq8(9v_HsmIu5PD0WkhYHt}UGcs0-%c}+Obd_sM`Il_!u}X6{ zJ(5d{ve~nKozvSC2=d)Tdf|F(ESgS~ImG2de?da|>iVk(pFg;1ukuJHn>l@J@V5i+ zoQ}vT$lk^;^nU%9dN=vSg*OIgLWjTlbF`0yjz53)_az{eOCKFlJbD z;F5HkFD{n_huyKSW#``J`+t4m&DXBHZ}O^-Z(f|7pK0{hJ+bj2|3BRGSve66x~sZd zyU;j4b#)1bq##MH%7y@v-GBb^#pv(`Z{2~mhknxe-Jo~ zCy$JrSYi;loWT+r70F1v=!=R)T%8TS9s2mtwkKNy4POrKI5G8aGgm`$aHt)y(>(TIu$mOM!?CkIsOtp2a?d(uQYW& zP=60U_{Y(crk-jzUh$ILS(nf2;YF0k4Xi6i&q)8vyAHV>uBY1{c`&#GM=nIJ4Ma!E zA4&m&NqX$gZ*Qh{Kb1+HnKCh#6qs3@`zZX+1MLqVr0$Up%#_JdL$yXxu)4nT#b-CJ zqou^7Bd2bsG)kbxI6QP5BsoL4$9G5i%Nc~Kc&|fJ^Y;%r=&HY`)?2g5AN>B7ukC5R zA4jGVcV52uMoG647s7#vCp<4NWd7U4zorw>dLNzDcul6?ep?0HeSI}{uL zLH}>Y3XViVi3{OCfd0G7N2J}wT;|Ad{|oohZf~0jjj{Wh`=U4-iC{y@3T!!UVX}&3zNScx)vJmw1ILX9<<$;#LR=CEf zRu2+wb^Y)f`--ZcRnoN^TI(mu7%^U`kae*1_r`3~`uUI+NxTgDKE$n1U2Uwfx@%?d gf0F+zxGPBh7ixl!?Qg?#od5s;07*qoM6N<$g3wzkOaK4? diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png deleted file mode 100644 index 8992d80b5e677e06fb7c26c51057921f2fab06ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4599 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


pRt=ekgBSgCysr`#^$)g2g=zhqLTaAPesU0c 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 aOk_*&w{h~Nbs#(um diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png deleted file mode 100644 index 40a864fdeae4d5f0ffb94b6c9e0c92ce7f22c301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)%jICh*qtBSdVaaovQ;EI1@hkqq^3 zRQ%kQ*HDb(sg3uZ1$(^eCMVCIQT_0e`#F>n(5N+%8@4b>K6Y_YL#6H|V=8tsSXR*; z+SRpSN&K~-kGg@I7w5GQL%oB6!S}maEGkeX-b*`urv~HoNU10#an;1NKOpG&2~VXa^n`fsPo7suddb*mNklh7Of<$jFp4re?3Qgi&=yaYX1bl3-<+8<-Dy!!V&6C>Y2a$d$NY0PzlfZj4~@FW&sdYPxk`pM;Q^ZJwpSR0+xzswaEO}IsBm`uBqShb?zmdn)L1cA&Tx|uIV#rW?#AKrR{_Rx()2@z{J(jSAZM^s? zM4gP`Tt64$T3M082U)-gu0bZzSj}PE3W~2Acs3_QCBeBh$_3i=5kI>nyM9+ZTe)mU zXDSK!t0lZ&5u%b!B@j?}k_Urjm)zS`0KDITGUGd8sw(5s02g`#Q0;YST3oh}qPt*OA)YN@s)R+WJQxCxRT$G<#0))BtBmvc9lW z8CWhZT6vvXIj7g#S%@GDujKl)$ z)ASI|_VIaPI8?^(m1?C$v&DA>53q;F1%a&IJlJ72m^7u$ z4s-wBYkUG=?-NM7*VwdjP|9UJy9aMGcXR?SCMJeu~WX|J7ODP^VBdd3U3Pyrs+J_* zc1<$+)a+4rFmG~k2$BZT?{?_Ma-yFaJvuaK@04D@r-3yOa&ZWfu2-0`u9BYP)8U9r z92O6vs1*6QU*qwsQ`$YEBV+!A89~zJB7d&yRQ6pTjhJ-LqVABo;@RWIL?$#ZB*#-mUjwKeu#A1Cm}Q*w0VF;>e<`0cM&<}lTRq0 z^R7ga%^8ty59oD=>~M})m|Dz;Q%~+Y?y{h=g~)QXS*Qmr@1WzPP)Iyd#}qJr`l*)~ zZakGi@g48_HRG5KaHNgF1c z-5A*uXk=HFqBFiO6vJVsN~fnH-7uX2f(Qh>*GO{{kAg}MH=Hr*j~hkrtE7@n;yntk z0JyNt#+Zbd$0^}WJ&^n)A|10FVO+~Qk#B32bZwGXUe)>YtQ$K4PkeOC8JBZZ3Gzuq z8nGvdA?o7phTw`M;dxB_g9}3mLlc$$%a5GkrwB2J);X#7NCNu-%_awwofy(c9&E-W zszxL|QANT!JaFg0{))NqgjsqI5^4=sikuEsj|U?|@&i{M)_DMrI}oAxn|t)bE;ajs zX>fD4m|=glB1HktGKI|$Tp$}%;C+ji`0o?1$%Guu&MNaNmyC!$Z#qow+k5ompWZY? z6PSdJx-Kt1pe+#gyKo~V18F>Fy~u=M`{4cSK3~L&BYz;VvRfs#vx?#v075iGYe!9g zG+EJTIliEjX-KxNDcF=XZhAl&c13;h^fMMJ9(23p=%^xGuWhyC)&gGAjwY&YfANoy ztw1)?Ahe;=OJR{nDF;J`3gYmR@6PZxt9d#TAqg%8!nQS@L<=rI(a+AFGzp7@lKj*2 zaNXrqeKsrutfet<6>dXaY{7fNFyGfiGiGg#D$e?q)$6 z4@Sa{)rZu}@i&CQ85*6t;S;Z?M;x;hv&^UcfaXaB><8YhULv#2#Rx3;`iJJ*7$qsU z=Gq>DlH6V5Sd&ZKe8c2OMs(pDMRvD4IjkhrxNJEt4d5c%%~|X%IY`i!VQtyJE3(+6 zt&!Bmf}~MCjTY%Oq`PWi(kL<3WGUihVaz$`KrYthO^b1V9uCCUgN%@#e;*f6dg0%5K9O{{Cn4n~4C~9aH@#HOAJRet`hmz>0L>G^& zgo`r!@-Dx+*FIO`~~=x6`H2 zJ9S(wpscXwkr%jOQ5Sz1!f^275O2Cm%_#Qk6{rF(NH87nT#~;OK0&ExKlPVFNxKck zswgaz!i+NQGhuN9HC7LEIaMX>l(5%o8=O+0?>+1#$NT9srU7UqUUacxm4Hc`v5>2tq{Mh;blMSZJ=mu+m9*tDVyOx>g} zx|zf!$pQ)~?AGyPfMy<-Ro17)6mC}W^EX?km@Daqe+ ziMYywzqYd;t{ku X{2RGMo3C-@00000NkvXXu0mjfne$Eo diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png deleted file mode 100644 index 7106c08f484fad38df0cbf809848359bdd8c9834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 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 AcmMzZ diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png deleted file mode 100644 index 98d270d271118ddaa5aba882a6b6d1d8ff0ea801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 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 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png deleted file mode 100644 index 779282c12191fad4e7d046e5ddb73f885b17781e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 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 JPDHLkV1iRG4_N>J diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png deleted file mode 100644 index 41a3dd2257afee329a47a0ecd4441c617c915c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 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 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json deleted file mode 100644 index bbde14f4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-60x60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-60x60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-20x20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-76x76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-76x76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-83.5x83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "AppIcon-prod-1024x1024@1x.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Info.plist index fd74b1c1..80173535 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Info.plist +++ b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Info.plist @@ -2,8 +2,12 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + WonderWords CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -18,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner/Runner.entitlements b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/11-create-your-own-widget-catalog/projects/final/ios/config/dev/.ignore b/11-create-your-own-widget-catalog/projects/final/ios/config/dev/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/config/dev/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/final/ios/config/dev/GoogleService-Info.plist deleted file mode 100644 index 94f3bdbd..00000000 --- a/11-create-your-own-widget-catalog/projects/final/ios/config/dev/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.67633443658-glol0em217f3bkcehn78440pa8uk7tir - API_KEY - AIzaSyCtQjSC3EiD5tDtJ4-fHh1bPAUASZfVAgo - GCM_SENDER_ID - 67633443658 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWordsDev - PROJECT_ID - wonder-words-dev - STORAGE_BUCKET - wonder-words-dev.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:67633443658:ios:ee73f9ddc856f860a8c7b3 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/ios/config/prod/.ignore b/11-create-your-own-widget-catalog/projects/final/ios/config/prod/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/final/ios/config/prod/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/final/ios/config/prod/GoogleService-Info.plist deleted file mode 100644 index e9062159..00000000 --- a/11-create-your-own-widget-catalog/projects/final/ios/config/prod/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 581028325132-6r6rdr8jhgfirrkretftm19das1a4cks.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.581028325132-6r6rdr8jhgfirrkretftm19das1a4cks - API_KEY - AIzaSyCz_4fRFcYhGt-9j0VmDLitKNLTVYWCf7U - GCM_SENDER_ID - 581028325132 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWords - PROJECT_ID - wonder-words-prod - STORAGE_BUCKET - wonder-words-prod.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:581028325132:ios:f2a34dfc51420c7111cb29 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/lib/dynamic_link.dart b/11-create-your-own-widget-catalog/projects/final/lib/dynamic_link.dart deleted file mode 100644 index 6faba8b6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/lib/dynamic_link.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:package_info/package_info.dart'; - -class DynamicLink { - static const _domainUriPrefix = 'https://wonderwordsdev.page.link'; - - final String path; - final SocialMetaTagParameters? socialMetaTagParameters; - - DynamicLink({ - required this.path, - this.socialMetaTagParameters, - }); - - Future get url async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: _domainUriPrefix, - link: Uri.parse( - '$_domainUriPrefix$path', - ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, - ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', - ), - socialMetaTagParameters: socialMetaTagParameters, - ); - - final shortLink = await parameters.buildShortLink(); - return shortLink.shortUrl.toString(); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/generated_plugin_registrant.dart b/11-create-your-own-widget-catalog/projects/final/lib/generated_plugin_registrant.dart deleted file mode 100644 index ed74637e..00000000 --- a/11-create-your-own-widget-catalog/projects/final/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,22 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars - -import 'package:firebase_analytics_web/firebase_analytics_web.dart'; -import 'package:firebase_core_web/firebase_core_web.dart'; -import 'package:share_plus_web/share_plus_web.dart'; -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - FirebaseAnalyticsWeb.registerWith(registrar); - FirebaseCoreWeb.registerWith(registrar); - SharePlusPlugin.registerWith(registrar); - UrlLauncherPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations.dart b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/lib/main.dart b/11-create-your-own-widget-catalog/projects/final/lib/main.dart index 7af4fa3b..1daed5a7 100644 --- a/11-create-your-own-widget-catalog/projects/final/lib/main.dart +++ b/11-create-your-own-widget-catalog/projects/final/lib/main.dart @@ -1,17 +1,15 @@ import 'dart:async'; +import 'dart:isolate'; import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -20,22 +18,55 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { - WidgetsFlutterBinding.ensureInitialized(); - runApp( - const WonderWords(), + // Has to be late so it doesn't instantiate before the + // `initializeMonitoringPackage()` call. + late final errorReportingService = ErrorReportingService(); + + runZonedGuarded>( + () async { + WidgetsFlutterBinding.ensureInitialized(); + await initializeMonitoringPackage(); + + final remoteValueService = RemoteValueService(); + await remoteValueService.load(); + + FlutterError.onError = errorReportingService.recordFlutterError; + + Isolate.current.addErrorListener( + RawReceivePort((pair) async { + final List errorAndStacktrace = pair; + await errorReportingService.recordError( + errorAndStacktrace.first, + errorAndStacktrace.last, + ); + }).sendPort, + ); + + runApp( + WonderWords( + remoteValueService: remoteValueService, + ), + ); + }, + (error, stack) => errorReportingService.recordError( + error, + stack, + fatal: true, + ), ); - log.i('Info Logger'); - log.d('Debug Logger'); - log.e('Error Logger'); - log.w('Warn Logger'); } class WonderWords extends StatefulWidget { - const WonderWords({Key? key}) : super(key: key); + const WonderWords({ + required this.remoteValueService, + Key? key, + }) : super(key: key); + + final RemoteValueService remoteValueService; @override _WonderWordsState createState() => _WonderWordsState(); @@ -43,6 +74,8 @@ class WonderWords extends StatefulWidget { class _WonderWordsState extends State { final _keyValueStorage = KeyValueStorage(); + final _analyticsService = AnalyticsService(); + final _dynamicLinkService = DynamicLinkService(); late final _favQsApi = FavQsApi( userTokenSupplier: () => _userRepository.getUserToken(), ); @@ -54,47 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ - ScreenViewObserver(), + ScreenViewObserver( + analyticsService: _analyticsService, + ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); - _openInitialDynamicLinkIfAny(); - _setupDynamicLinksListener(); - } - Future _setupDynamicLinksListener() async { - FirebaseDynamicLinks.instance.onLink( - onSuccess: ( - PendingDynamicLinkData? dynamicLink, - ) async { - final Uri? deepLink = dynamicLink?.link; + _openInitialDynamicLinkIfAny(); - if (deepLink != null) { - _navigator.push(deepLink.path); - } - }, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final PendingDynamicLinkData? data = - await FirebaseDynamicLinks.instance.getInitialLink(); - final Uri? deepLink = data?.link; - - if (deepLink != null) { - _navigator.push(deepLink.path); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); + if (path != null) { + _routerDelegate.push(path); } } @@ -104,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -111,27 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/11-create-your-own-widget-catalog/projects/final/lib/routes.dart b/11-create-your-own-widget-catalog/projects/final/lib/routes.dart deleted file mode 100644 index 988faaf8..00000000 --- a/11-create-your-own-widget-catalog/projects/final/lib/routes.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/dynamic_link.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? ''), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => DynamicLink( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ).url, - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '$signInPath/sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/routing_table.dart b/11-create-your-own-widget-catalog/projects/final/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/screen_view_observer.dart b/11-create-your-own-widget-catalog/projects/final/lib/screen_view_observer.dart index 97c7518b..ad8e53a3 100644 --- a/11-create-your-own-widget-catalog/projects/final/lib/screen_view_observer.dart +++ b/11-create-your-own-widget-catalog/projects/final/lib/screen_view_observer.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:monitoring/monitoring.dart'; import 'package:routemaster/routemaster.dart'; -typedef ScreenNameExtractor = String? Function(RouteSettings settings); - -String? defaultNameExtractor(RouteSettings settings) => settings.name; - class ScreenViewObserver extends RoutemasterObserver { ScreenViewObserver({ - this.nameExtractor = defaultNameExtractor, - Function(PlatformException error)? onError, - }) : _onError = onError; + required this.analyticsService, + }); + + final AnalyticsService analyticsService; + + void _sendScreenView(PageRoute route) { + final String? screenName = route.settings.name; - final ScreenNameExtractor nameExtractor; - final void Function(PlatformException error)? _onError; + if (screenName != null) { + analyticsService.setCurrentScreen(screenName); + } + } @override void didPush(Route route, Route? previousRoute) { @@ -31,24 +32,4 @@ class ScreenViewObserver extends RoutemasterObserver { _sendScreenView(previousRoute); } } - - @override - void didChangeRoute(RouteData routeData, Page page) {} - - void _sendScreenView(PageRoute route) { - final String? screenName = nameExtractor(route.settings); - if (screenName != null) { - analytics.setCurrentScreen(screenName: screenName).catchError( - (Object error) { - final _onError = this._onError; - if (_onError == null) { - log.e('$ScreenViewObserver: $error'); - } else { - _onError(error as PlatformException); - } - }, - test: (Object error) => error is PlatformException, - ); - } - } } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/home_screen.dart b/11-create-your-own-widget-catalog/projects/final/lib/tab_container_screen.dart similarity index 92% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/home_screen.dart rename to 11-create-your-own-widget-catalog/projects/final/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/home_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/11-create-your-own-widget-catalog/projects/final/makefile b/11-create-your-own-widget-catalog/projects/final/makefile index 3f640d71..dd578f08 100644 --- a/11-create-your-own-widget-catalog/projects/final/makefile +++ b/11-create-your-own-widget-catalog/projects/final/makefile @@ -10,6 +10,14 @@ print: echo $${package} ; \ done +pods-clean: + rm -Rf ios/Pods ; \ + rm -Rf ios/.symlinks ; \ + rm -Rf ios/Flutter/Flutter.framework ; \ + rm -Rf ios/Flutter/Flutter.podspec ; \ + rm ios/Podfile ; \ + rm ios/Podfile.lock ; \ + get: flutter pub get @@ -26,6 +34,21 @@ get: cd ../../ ; \ done +upgrade: + flutter pub upgrade + for feature in $(FEATURES); do \ + cd $${feature} ; \ + echo "Updating dependencies on $${feature}" ; \ + flutter pub upgrade ; \ + cd ../../../ ; \ + done + for package in $(PACKAGES); do \ + cd $${package} ; \ + echo "Updating dependencies on $${package}" ; \ + flutter pub upgrade ; \ + cd ../../ ; \ + done + lint: flutter analyze diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config.json deleted file mode 100644 index eeb05014..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config.json +++ /dev/null @@ -1 +0,0 @@ -{"configVersion":2,"packages":[{"name":"_fe_analyzer_shared","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"analyzer","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0","packageUri":"lib/","languageVersion":"2.14"},{"name":"archive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"args","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"auto_size_text","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"boolean_selector","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"characters","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"charcode","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"cli_util","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"clock","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"collection","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"convert","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"coverage","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"crypto","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"fake_async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"file","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter","rootUri":"file:///Users/vid/flutter/packages/flutter","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_localizations","rootUri":"file:///Users/vid/flutter/packages/flutter_localizations","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_svg","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_test","rootUri":"file:///Users/vid/flutter/packages/flutter_test","packageUri":"lib/","languageVersion":"2.12"},{"name":"frontend_server_client","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"glob","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"graphs","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"http","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_multi_server","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_parser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"intl","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"io","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"js","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"logging","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"lottie","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"matcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11","packageUri":"lib/","languageVersion":"2.12"},{"name":"material_color_utilities","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3","packageUri":"lib/","languageVersion":"2.13"},{"name":"meta","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mime","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mocktail","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"node_preamble","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"package_config","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_drawing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_parsing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"pedantic","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"petitparser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pool","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pub_semver","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"rive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_packages_handler","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_static","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_web_socket","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"sky_engine","rootUri":"file:///Users/vid/flutter/bin/cache/pkg/sky_engine","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_map_stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_maps","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_span","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"stream_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"string_scanner","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"term_glyph","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"test","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5","packageUri":"lib/","languageVersion":"2.14"},{"name":"test_api","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8","packageUri":"lib/","languageVersion":"2.12"},{"name":"test_core","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9","packageUri":"lib/","languageVersion":"2.14"},{"name":"typed_data","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"vector_math","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1","packageUri":"lib/","languageVersion":"2.14"},{"name":"vm_service","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"watcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"web_socket_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"webkit_inspection_protocol","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"xml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"yaml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"component_library","rootUri":"../","packageUri":"lib/","languageVersion":"2.14"},{"name":"flutter_gen","rootUri":"flutter_gen","languageVersion":"2.12"}],"generated":"2022-04-19T00:26:08.928495Z","generator":"pub","generatorVersion":"2.16.2"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config_subset deleted file mode 100644 index 8cb9e6c0..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/package_config_subset +++ /dev/null @@ -1,293 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.packages b/11-create-your-own-widget-catalog/projects/final/packages/component_library/.packages deleted file mode 100644 index 162deb93..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/.packages +++ /dev/null @@ -1,79 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:08.914199. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -component_library:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/closing-quote.svg b/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/closing-quote.svg +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/opening-quote.svg b/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/opening-quote.svg index 72e00372..c32e06de 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/opening-quote.svg +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/assets/opening-quote.svg @@ -1,16 +1 @@ - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj index deb66dee..30b65244 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -272,7 +272,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -346,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -395,7 +395,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner/Info.plist index a060db61..1579fb30 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner/Info.plist +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/ios/Runner/Info.plist @@ -41,5 +41,7 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart index feab620a..df49d89d 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart @@ -145,14 +145,6 @@ List getStories(WonderThemeData theme) { : null, ), ), - Story.simple( - name: 'Loading Indicator', - section: 'Indicators', - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 200.0), - child: LoadingIndicator(), - ), - ), Story( name: 'QuoteCard', section: 'Quote', @@ -180,8 +172,8 @@ List getStories(WonderThemeData theme) { child: ListView.separated( itemCount: 15, itemBuilder: (_, __) => child, - separatorBuilder: (_, __) => Divider( - height: theme.listSpacing, + separatorBuilder: (_, __) => const Divider( + height: 16.0, ), ), ), @@ -227,6 +219,10 @@ List getStories(WonderThemeData theme) { ), ), ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), Story( name: 'Rounded Choice Chip', padding: const EdgeInsets.all( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.lock deleted file mode 100644 index 3af732ee..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.lock +++ /dev/null @@ -1,327 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.6" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: ".." - relative: true - source: path - version: "0.0.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - device_frame: - dependency: transitive - description: - name: device_frame - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "0.15.0" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - recase: - dependency: transitive - description: - name: recase - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.32" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - storybook_flutter: - dependency: "direct main" - description: - name: storybook_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.yaml index 638d550b..b295e253 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/pubspec.yaml @@ -1,4 +1,5 @@ name: component_library_storybook +version: 1.0.0+1 publish_to: none environment: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/component_library.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/component_library.dart index 933e6f05..90c09be6 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/component_library.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/component_library.dart @@ -22,4 +22,3 @@ export 'src/theme/spacing.dart'; export 'src/theme/wonder_theme.dart'; export 'src/theme/wonder_theme_data.dart'; export 'src/upvote_icon_button.dart'; -export 'src/loading_indicator.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/count_indicator_icon_button.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/count_indicator_icon_button.dart index 83954a16..66558e26 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/count_indicator_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/count_indicator_icon_button.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class CountIndicatorIconButton extends StatefulWidget { +class CountIndicatorIconButton extends StatelessWidget { const CountIndicatorIconButton({ required this.count, required this.iconData, @@ -18,39 +17,26 @@ class CountIndicatorIconButton extends StatefulWidget { final String? tooltip; final VoidCallback? onTap; - @override - State createState() => - _CountIndicatorIconButtonState(); -} - -class _CountIndicatorIconButtonState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { @override Widget build(BuildContext context) { - return ScaleTransition( - scale: scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: widget.tooltip, - padding: const EdgeInsets.all(0), - icon: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - widget.iconData, - color: widget.iconColor, - ), - Text( - widget.count.toString(), - style: const TextStyle( - fontSize: FontSize.small, - ), + return IconButton( + onPressed: onTap, + tooltip: tooltip, + padding: const EdgeInsets.all(0), + icon: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + iconData, + color: iconColor, + ), + Text( + count.toString(), + style: const TextStyle( + fontSize: FontSize.small, ), - ], - ), + ), + ], ), ); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/exception_indicator.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/exception_indicator.dart index ad6d74db..9a2259e8 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/exception_indicator.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:rive/rive.dart'; class ExceptionIndicator extends StatelessWidget { const ExceptionIndicator({ @@ -26,15 +25,12 @@ class ExceptionIndicator extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const SizedBox( - height: 200, - child: RiveAnimation.asset( - 'assets/animations/on_off_switch.riv', - animations: ['Off'], - ), + const Icon( + Icons.error, + size: 48, ), const SizedBox( - height: Spacing.medium, + height: Spacing.xxLarge, ), Text( title ?? l10n.exceptionIndicatorGenericTitle, diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/favorite_icon_button.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/favorite_icon_button.dart index 51933644..44092c1d 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/favorite_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/favorite_icon_button.dart @@ -1,7 +1,7 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -class FavoriteIconButton extends StatefulWidget { +class FavoriteIconButton extends StatelessWidget { const FavoriteIconButton({ required this.isFavorite, this.onTap, @@ -11,59 +11,14 @@ class FavoriteIconButton extends StatefulWidget { final bool isFavorite; final VoidCallback? onTap; - @override - State createState() => _FavoriteIconButtonState(); -} - -class _FavoriteIconButtonState extends State - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.8; - double partition = 0.7; - Duration duration = kThemeAnimationDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - _scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), - weight: partition, - ), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), - weight: 1 - partition, - ) - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } - @override Widget build(BuildContext context) { final l10n = ComponentLibraryLocalizations.of(context); - return ScaleTransition( - scale: _scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: l10n.favoriteIconButtonTooltip, - icon: Icon( - widget.isFavorite ? Icons.favorite : Icons.favorite_border_outlined, - ), + return IconButton( + onPressed: onTap, + tooltip: l10n.favoriteIconButtonTooltip, + icon: Icon( + isFavorite ? Icons.favorite : Icons.favorite_border_outlined, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart index eca59dc4..9c334bc7 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -60,15 +60,18 @@ import 'component_library_localizations_en.dart'; /// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales /// property. abstract class ComponentLibraryLocalizations { - ComponentLibraryLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + ComponentLibraryLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static ComponentLibraryLocalizations of(BuildContext context) { - return Localizations.of(context, ComponentLibraryLocalizations)!; + return Localizations.of( + context, ComponentLibraryLocalizations)!; } - static const LocalizationsDelegate delegate = _ComponentLibraryLocalizationsDelegate(); + static const LocalizationsDelegate delegate = + _ComponentLibraryLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -80,7 +83,8 @@ abstract class ComponentLibraryLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ + static const List> localizationsDelegates = + >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -89,7 +93,8 @@ abstract class ComponentLibraryLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @downvoteIconButtonTooltip. @@ -159,33 +164,37 @@ abstract class ComponentLibraryLocalizations { String get authenticationRequiredErrorSnackbarMessage; } -class _ComponentLibraryLocalizationsDelegate extends LocalizationsDelegate { +class _ComponentLibraryLocalizationsDelegate + extends LocalizationsDelegate { const _ComponentLibraryLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture(lookupComponentLibraryLocalizations(locale)); + return SynchronousFuture( + lookupComponentLibraryLocalizations(locale)); } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations lookupComponentLibraryLocalizations(Locale locale) { - - +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( + Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': return ComponentLibraryLocalizationsEn(); + case 'en': + return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( - 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' - ); + 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index abbb4044..bb2968c0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'component_library_localizations.dart'; /// The translations for English (`en`). @@ -32,11 +29,14 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { String get exceptionIndicatorTryAgainButton => 'Try Again'; @override - String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.'; + String get exceptionIndicatorGenericMessage => + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override - String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.'; + String get genericErrorSnackbarMessage => + 'There has been an error. Please, check your internet connection.'; @override - String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.'; + String get authenticationRequiredErrorSnackbarMessage => + 'You need to sign in before performing this action.'; } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/loading_indicator.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/loading_indicator.dart deleted file mode 100644 index 0f589516..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/loading_indicator.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:lottie/lottie.dart'; - -class LoadingIndicator extends StatelessWidget { - const LoadingIndicator({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 32, - horizontal: 16, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Lottie.asset('assets/animations/loader.json'), - ], - ), - ), - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/mixins/animation_mixin.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/mixins/animation_mixin.dart deleted file mode 100644 index 3dea8ef7..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/mixins/animation_mixin.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -mixin ScaleAnimationMixin - on SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.7; - double partition = 0.5; - Duration duration = kThemeChangeDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), weight: partition), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), weight: partition), - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/quote_card.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/quote_card.dart index f58fc2b1..5428cb36 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/quote_card.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/quote_card.dart @@ -44,10 +44,14 @@ class QuoteCard extends StatelessWidget { child: top, ), const Spacer(), - FavoriteIconButton( - isFavorite: isFavorite, - onTap: onFavorite, - ), + IconButton( + onPressed: onFavorite, + icon: Icon( + isFavorite + ? Icons.favorite + : Icons.favorite_border_outlined, + ), + ) ], ), Padding( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/rounded_choice_chip.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/rounded_choice_chip.dart index ad9327d7..46806b51 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/rounded_choice_chip.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/rounded_choice_chip.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class RoundedChoiceChip extends StatefulWidget { +class RoundedChoiceChip extends StatelessWidget { const RoundedChoiceChip({ required this.label, required this.isSelected, @@ -24,44 +23,29 @@ class RoundedChoiceChip extends StatefulWidget { final Color? selectedBackgroundColor; final bool isSelected; - @override - State createState() => _RoundedChoiceChipState(); -} - -class _RoundedChoiceChipState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { - @override - double get scaleTo => 0.9; - @override Widget build(BuildContext context) { - final WonderThemeData theme = WonderTheme.of(context); - return ScaleTransition( - scale: scaleAnimation, - child: ChoiceChip( - shape: const StadiumBorder( - side: BorderSide(), - ), - avatar: widget.avatar, - label: Text( - widget.label, - style: TextStyle( - color: widget.isSelected - ? (widget.selectedLabelColor ?? - theme.roundedChoiceChipSelectedLabelColor) - : (widget.labelColor ?? theme.roundedChoiceChipLabelColor), - ), + final theme = WonderTheme.of(context); + return ChoiceChip( + shape: const StadiumBorder( + side: BorderSide(), + ), + avatar: avatar, + label: Text( + label, + style: TextStyle( + color: isSelected + ? (selectedLabelColor ?? + theme.roundedChoiceChipSelectedLabelColor) + : (labelColor ?? theme.roundedChoiceChipLabelColor), ), - onSelected: (isSelected) { - widget.onSelected?.call(isSelected); - animate(); - }, - selected: widget.isSelected, - backgroundColor: - (widget.backgroundColor ?? theme.roundedChoiceChipBackgroundColor), - selectedColor: (widget.selectedBackgroundColor ?? - theme.roundedChoiceChipSelectedBackgroundColor), ), + onSelected: onSelected, + selected: isSelected, + backgroundColor: + (backgroundColor ?? theme.roundedChoiceChipBackgroundColor), + selectedColor: (selectedBackgroundColor ?? + theme.roundedChoiceChipSelectedBackgroundColor), ); } } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/theme/wonder_theme_data.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/theme/wonder_theme_data.dart index e938e794..fab49c3f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/lib/src/theme/wonder_theme_data.dart @@ -6,12 +6,6 @@ const _dividerThemeData = DividerThemeData( space: 0, ); -ElevatedButtonThemeData get buttonThemeData => ElevatedButtonThemeData( - style: ButtonStyle( - shape: const StadiumBorder().materialize(), - ), - ); - // If the number of properties get too big, we can start grouping them in // classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. abstract class WonderThemeData { @@ -19,14 +13,8 @@ abstract class WonderThemeData { double screenMargin = Spacing.mediumLarge; - double searchBarMargin = Spacing.xSmall; - double gridSpacing = Spacing.mediumLarge; - double listSpacing = Spacing.mediumLarge; - - double inputDecorationBorderRadius = Spacing.medium; - Color get roundedChoiceChipBackgroundColor; Color get roundedChoiceChipSelectedBackgroundColor; @@ -45,25 +33,6 @@ abstract class WonderThemeData { Color get votedButtonColor; - Color get textFieldBorderColor; - - MaterialColor get fabBackgroundColor; - - MaterialColor get fabForegroundColor; - - FloatingActionButtonThemeData get fabThemeData => - FloatingActionButtonThemeData( - backgroundColor: fabBackgroundColor.shade600, - foregroundColor: fabForegroundColor, - ); - - InputDecorationTheme get inputDecorationTheme => InputDecorationTheme( - border: OutlineInputBorder( - borderSide: BorderSide(color: textFieldBorderColor), - borderRadius: BorderRadius.circular(inputDecorationBorderRadius), - ), - ); - TextStyle quoteTextStyle = const TextStyle( fontFamily: 'Fondamento', package: 'component_library', @@ -76,9 +45,6 @@ class LightWonderThemeData extends WonderThemeData { brightness: Brightness.light, primarySwatch: Colors.black.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -107,15 +73,6 @@ class LightWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.black; - - @override - MaterialColor get fabBackgroundColor => Colors.black.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.white.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.black; } class DarkWonderThemeData extends WonderThemeData { @@ -125,9 +82,6 @@ class DarkWonderThemeData extends WonderThemeData { toggleableActiveColor: Colors.white, primarySwatch: Colors.white.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -156,15 +110,6 @@ class DarkWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.white; - - @override - MaterialColor get fabBackgroundColor => Colors.white.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.black.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.white; } extension on Color { @@ -186,9 +131,3 @@ extension on Color { _toSwatch(), ); } - -extension OutlinedBorderExtensions on OutlinedBorder { - MaterialStateProperty materialize() { - return MaterialStateProperty.all(this); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.lock deleted file mode 100644 index 6a3c9b3f..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: "direct main" - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: "direct main" - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.yaml index 0463ec20..d75f7082 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/pubspec.yaml @@ -9,10 +9,9 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter + intl: ^0.17.0 flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 - rive: ^0.7.28 - lottie: ^1.1.0 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config.json deleted file mode 100644 index 0f3617a0..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:17.509405Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config_subset deleted file mode 100644 index f37c3809..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/package_config_subset +++ /dev/null @@ -1,201 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.packages b/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.packages deleted file mode 100644 index 3a9b3101..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/.packages +++ /dev/null @@ -1,56 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:17.496589. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -domain_models:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/domain_models/pubspec.lock deleted file mode 100644 index 095e6d55..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/domain_models/pubspec.lock +++ /dev/null @@ -1,348 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.6.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.10" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.8" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.19" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config.json deleted file mode 100644 index 43d1b750..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config.json +++ /dev/null @@ -1,440 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_serializable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:22.764340Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config_subset deleted file mode 100644 index dbe74cc6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/package_config_subset +++ /dev/null @@ -1,289 +0,0 @@ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.packages b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.packages deleted file mode 100644 index 20ec9ccb..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/.packages +++ /dev/null @@ -1,78 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:22.746626. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -fav_qs_api:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.lock deleted file mode 100644 index 8f61c803..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/common_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config.json deleted file mode 100644 index 5244c972..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:41.230983Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config_subset deleted file mode 100644 index 755ca6d0..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins-dependencies deleted file mode 100644 index 47d64ded..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:41.452138","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.packages deleted file mode 100644 index 8a741b63..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:41.197965. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -forgot_my_password:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart index 49ca8b27..f40a9e51 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart @@ -19,13 +19,13 @@ class ForgotMyPasswordCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), ); @@ -35,7 +35,7 @@ class ForgotMyPasswordCubit extends Cubit { void onEmailUnfocused() { final newState = state.copyWith( - email: Email.dirty( + email: Email.validated( state.email.value, ), ); @@ -43,10 +43,10 @@ class ForgotMyPasswordCubit extends Cubit { } void onSubmit() async { - final email = Email.dirty(state.email.value); + final email = Email.validated(state.email.value); final newState = state.copyWith( email: email, - status: email.valid ? FormzStatus.submissionInProgress : state.status, + submissionStatus: email.valid ? SubmissionStatus.inProgress : null, ); emit(newState); if (email.valid) { @@ -55,12 +55,12 @@ class ForgotMyPasswordCubit extends Cubit { email.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, + submissionStatus: SubmissionStatus.success, ); emit(newState); - } catch (error) { + } catch (_) { final newState = state.copyWith( - status: FormzStatus.submissionFailure, + submissionStatus: SubmissionStatus.error, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart index 846998db..4be5eef2 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart @@ -66,7 +66,7 @@ class _ForgotMyPasswordViewState extends State { final l10n = ForgotMyPasswordLocalizations.of(context); return BlocConsumer( listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -86,7 +86,7 @@ class _ForgotMyPasswordViewState extends State { builder: (context, state) { final cubit = context.read(); final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final emailError = state.email.invalid ? state.email.error : null; return GestureDetector( onTap: () => _releaseFocus(context), @@ -100,6 +100,7 @@ class _ForgotMyPasswordViewState extends State { enabled: !isSubmissionInProgress, onEditingComplete: cubit.onSubmit, onChanged: cubit.onEmailChanged, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -113,18 +114,18 @@ class _ForgotMyPasswordViewState extends State { : l10n.emailTextFieldInvalidErrorMessage), ), ), - if (state.status.isSubmissionFailure) + if (state.submissionStatus == SubmissionStatus.error) ...[ const SizedBox( height: Spacing.medium, ), - if (state.status.isSubmissionFailure) Text( l10n.errorMessage, style: const TextStyle( color: Colors.red, fontSize: FontSize.medium, ), - ) + ), + ], ], ), actions: [ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart index 7701b4a5..333d7041 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart @@ -2,27 +2,34 @@ part of 'forgot_my_password_cubit.dart'; class ForgotMyPasswordState extends Equatable { const ForgotMyPasswordState({ - this.email = const Email.pure(), - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; - final FormzStatus status; + final SubmissionStatus submissionStatus; ForgotMyPasswordState copyWith({ Email? email, Password? password, - FormzStatus? status, + SubmissionStatus? submissionStatus, }) { return ForgotMyPasswordState( email: email ?? this.email, - status: status ?? this.status, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ email, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.lock deleted file mode 100644 index 37d2f6c8..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: transitive - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.yaml index da9acf75..fc6d79ab 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config.json deleted file mode 100644 index 6ca4a7dc..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config.json +++ /dev/null @@ -1,608 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:44.949230Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config_subset deleted file mode 100644 index dba1cbdf..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/package_config_subset +++ /dev/null @@ -1,401 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins-dependencies deleted file mode 100644 index ff49de10..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:45.163726","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.packages deleted file mode 100644 index 1756cc86..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/.packages +++ /dev/null @@ -1,106 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:44.916586. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -profile_menu:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_en.arb index 12093a3b..2089593b 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_en.arb @@ -13,5 +13,7 @@ "darkModePreferencesAlwaysDarkTileLabel": "Always Dark", "darkModePreferencesAlwaysLightTileLabel": "Always Light", "darkModePreferencesUseSystemSettingsTileLabel": "Use System Settings", - "signOutButtonLabel": "Sign Out" + "signOutButtonLabel": "Sign Out", + "signUpOpeningText": "Don't have an account?", + "signUpButtonLabel": "Sign up" } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index d4904a02..71f77a0c 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -140,6 +144,18 @@ abstract class ProfileMenuLocalizations { /// In en, this message translates to: /// **'Sign Out'** String get signOutButtonLabel; + + /// No description provided for @signUpOpeningText. + /// + /// In en, this message translates to: + /// **'Don\'t have an account?'** + String get signUpOpeningText; + + /// No description provided for @signUpButtonLabel. + /// + /// In en, this message translates to: + /// **'Sign up'** + String get signUpButtonLabel; } class _ProfileMenuLocalizationsDelegate @@ -149,22 +165,24 @@ class _ProfileMenuLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupProfileMenuLocalizations(locale)); + lookupProfileMenuLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; } -ProfileMenuLocalizations _lookupProfileMenuLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart index bc456b36..098adb27 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart @@ -30,4 +30,10 @@ class ProfileMenuLocalizationsEn extends ProfileMenuLocalizations { @override String get signOutButtonLabel => 'Sign Out'; + + @override + String get signUpOpeningText => 'Don\'t have an account?'; + + @override + String get signUpButtonLabel => 'Sign up'; } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index eeda3d0c..e3017b85 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,23 +1,27 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, required this.quoteRepository, this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; final VoidCallback? onUpdateProfileTap; + final VoidCallback? onSignUpTap; final UserRepository userRepository; final QuoteRepository quoteRepository; @@ -31,6 +35,7 @@ class ProfileMenuScreen extends StatelessWidget { child: ProfileMenuView( onSignInTap: onSignInTap, onUpdateProfileTap: onUpdateProfileTap, + onSignUpTap: onSignUpTap, ), ); } @@ -40,11 +45,13 @@ class ProfileMenuScreen extends StatelessWidget { class ProfileMenuView extends StatelessWidget { const ProfileMenuView({ this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; + final VoidCallback? onSignUpTap; final VoidCallback? onUpdateProfileTap; @override @@ -59,10 +66,26 @@ class ProfileMenuView extends StatelessWidget { final username = state.username; return Column( children: [ - if (!state.isUserAuthenticated) + if (!state.isUserAuthenticated) ...[ _SignInButton( onSignInTap: onSignInTap, ), + const SizedBox( + height: Spacing.xLarge, + ), + Text( + l10n.signUpOpeningText, + ), + TextButton( + child: Text( + l10n.signUpButtonLabel, + ), + onPressed: onSignUpTap, + ), + const SizedBox( + height: Spacing.large, + ), + ], if (username != null) ...[ Expanded( child: Center( @@ -124,9 +147,10 @@ class _SignInButton extends StatelessWidget { final theme = WonderTheme.of(context); final l10n = ProfileMenuLocalizations.of(context); return Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - vertical: Spacing.xxLarge, + padding: EdgeInsets.only( + left: theme.screenMargin, + right: theme.screenMargin, + top: Spacing.xxLarge, ), child: ExpandedElevatedButton( onTap: onSignInTap, diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.lock deleted file mode 100644 index 4291e695..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.lock +++ /dev/null @@ -1,691 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.yaml index c9d1921a..8f33a7c1 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: ^0.17.0 quote_repository: path: ../../quote_repository - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository domain_models: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config.json deleted file mode 100644 index 603576cb..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config.json +++ /dev/null @@ -1,668 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:50.124357Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config_subset deleted file mode 100644 index b87e785f..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/package_config_subset +++ /dev/null @@ -1,441 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins deleted file mode 100644 index b3a1e738..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins +++ /dev/null @@ -1,13 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins-dependencies deleted file mode 100644 index 4fcebc66..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/","dependencies":[]}],"web":[{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:50.331649","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.packages deleted file mode 100644 index 479d1b42..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/.packages +++ /dev/null @@ -1,116 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:50.100337. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_details:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/l10n.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/quote_details.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/quote_details.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_cubit.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_cubit.dart index eb3f094e..597cc6ce 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_cubit.dart @@ -31,7 +31,7 @@ class QuoteDetailsCubit extends Cubit { } } - void refresh() { + Future refetch() async { emit( const QuoteDetailsInProgress(), ); @@ -39,37 +39,37 @@ class QuoteDetailsCubit extends Cubit { _fetchQuoteDetails(); } - void upvoteQuote() { - _executeQuoteUpdateOperation( + void upvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.upvoteQuote(quoteId), ); } - void downvoteQuote() { - _executeQuoteUpdateOperation( + void downvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.downvoteQuote(quoteId), ); } - void unvoteQuote() { - _executeQuoteUpdateOperation( + void unvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unvoteQuote(quoteId), ); } - void favoriteQuote() { - _executeQuoteUpdateOperation( + void favoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.favoriteQuote(quoteId), ); } - void unfavoriteQuote() { - _executeQuoteUpdateOperation( + void unfavoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unfavoriteQuote(quoteId), ); } - void _executeQuoteUpdateOperation( + Future _executeQuoteUpdateOperation( Future Function() updateQuote, ) async { try { @@ -85,7 +85,7 @@ class QuoteDetailsCubit extends Cubit { emit( QuoteDetailsSuccess( quote: lastState.quote, - eventError: error, + quoteUpdateError: error, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 6690a7f0..c4242afc 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/src/l10n/quote_details_localizations.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,105 +43,64 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); return StyledStatusBar.dark( child: BlocConsumer( listener: (context, state) { - final eventError = - state is QuoteDetailsSuccess ? state.eventError : null; - if (eventError != null) { - final snackBar = eventError is UserAuthenticationRequiredException - ? const AuthenticationRequiredErrorSnackBar() - : const GenericErrorSnackBar(); + final quoteUpdateError = + state is QuoteDetailsSuccess ? state.quoteUpdateError : null; + if (quoteUpdateError != null) { + final snackBar = + quoteUpdateError is UserAuthenticationRequiredException + ? const AuthenticationRequiredErrorSnackBar() + : const GenericErrorSnackBar(); ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(snackBar); - if (eventError is UserAuthenticationRequiredException) { + if (quoteUpdateError is UserAuthenticationRequiredException) { onAuthenticationError(); } } }, builder: (context, state) { - final quote = state is QuoteDetailsSuccess ? state.quote : null; - final cubit = context.read(); return WillPopScope( onWillPop: () async { - Navigator.of(context).pop(quote); + final displayedQuote = + state is QuoteDetailsSuccess ? state.quote : null; + Navigator.of(context).pop(displayedQuote); return false; }, child: Scaffold( - appBar: RowAppBar( - children: [ - if (quote != null) ...[ - FavoriteIconButton( - isFavorite: quote.isFavorite ?? false, - onTap: () { - if (quote.isFavorite == true) { - cubit.unfavoriteQuote(); - } else { - cubit.favoriteQuote(); - } - }, - ), - UpvoteIconButton( - count: quote.upvotesCount, - isUpvoted: quote.isUpvoted ?? false, - onTap: () { - if (quote.isUpvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.upvoteQuote(); - } - }, - ), - DownvoteIconButton( - count: quote.downvotesCount, - isDownvoted: quote.isDownvoted ?? false, - onTap: () { - if (quote.isDownvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.downvoteQuote(); - } - }, - ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( - url, - ), - ); - }, - ), - ] - ], - ), + appBar: state is QuoteDetailsSuccess + ? _QuoteActionsAppBar( + quote: state.quote, + shareableLinkGenerator: shareableLinkGenerator, + ) + : null, body: SafeArea( child: Padding( padding: EdgeInsets.all( - theme.screenMargin, + WonderTheme.of(context).screenMargin, ), - child: quote != null + child: state is QuoteDetailsSuccess ? _Quote( - quote: quote, + quote: state.quote, ) : state is QuoteDetailsFailure ? ExceptionIndicator( onTryAgain: () { - cubit.refresh(); + final cubit = context.read(); + cubit.refetch(); }, ) : const CenteredCircularProgressIndicator(), @@ -156,6 +114,72 @@ class QuoteDetailsView extends StatelessWidget { } } +class _QuoteActionsAppBar extends StatelessWidget + implements PreferredSizeWidget { + const _QuoteActionsAppBar({ + required this.quote, + this.shareableLinkGenerator, + Key? key, + }) : super(key: key); + + final Quote quote; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; + + @override + Widget build(BuildContext context) { + final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; + return RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: quote.isFavorite ?? false, + onTap: () { + if (quote.isFavorite == true) { + cubit.unfavoriteQuote(); + } else { + cubit.favoriteQuote(); + } + }, + ), + UpvoteIconButton( + count: quote.upvotesCount, + isUpvoted: quote.isUpvoted ?? false, + onTap: () { + if (quote.isUpvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.upvoteQuote(); + } + }, + ), + DownvoteIconButton( + count: quote.downvotesCount, + isDownvoted: quote.isDownvoted ?? false, + onTap: () { + if (quote.isDownvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.downvoteQuote(); + } + }, + ), + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( + url, + ); + }, + ), + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} + class _Quote extends StatelessWidget { static const double _quoteIconWidth = 46; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_state.dart index 229d6375..f89c5c92 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/src/quote_details_state.dart @@ -2,31 +2,34 @@ part of 'quote_details_cubit.dart'; abstract class QuoteDetailsState extends Equatable { const QuoteDetailsState(); - - @override - List get props => []; } class QuoteDetailsInProgress extends QuoteDetailsState { const QuoteDetailsInProgress(); + + @override + List get props => []; } class QuoteDetailsSuccess extends QuoteDetailsState { const QuoteDetailsSuccess({ required this.quote, - this.eventError, + this.quoteUpdateError, }); final Quote quote; - final dynamic eventError; + final dynamic quoteUpdateError; @override List get props => [ quote, - eventError, + quoteUpdateError, ]; } class QuoteDetailsFailure extends QuoteDetailsState { const QuoteDetailsFailure(); + + @override + List get props => []; } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.lock deleted file mode 100644 index 551ad252..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.lock +++ /dev/null @@ -1,759 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - share_plus: - dependency: "direct main" - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.9" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.yaml index 856ced49..5f16c003 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_details/pubspec.yaml @@ -8,8 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 - share_plus: ^2.1.4 + flutter_bloc: ^8.0.1 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config.json deleted file mode 100644 index 6ddd7e74..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config.json +++ /dev/null @@ -1,626 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_list", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:53.929898Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config_subset deleted file mode 100644 index 569af0b5..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/package_config_subset +++ /dev/null @@ -1,413 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins-dependencies deleted file mode 100644 index e69dd80c..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:54.172364","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.packages deleted file mode 100644 index 3e7cae90..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/.packages +++ /dev/null @@ -1,109 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:53.902060. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_list:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 22ffba03..2ccb5ec1 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:bloc_concurrency/bloc_concurrency.dart'; import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -19,23 +20,17 @@ class QuoteListBloc extends Bloc { super( const QuoteListState(), ) { - _registerEventHandler(); + _registerEventsHandler(); - add( - const QuoteListFirstPageRequested(), - ); + _authChangesSubscription = userRepository.getUser().listen( + (user) { + _authenticatedUsername = user?.username; - _authChangesSubscription = userRepository - .getUser() - .where( - (user) => user?.username != _authenticatedUsername, - ) - .listen((user) { - _authenticatedUsername = user?.username; - add( - const QuoteListUserAuthenticationChanged(), - ); - }); + add( + const QuoteListUsernameObtained(), + ); + }, + ); } late final StreamSubscription _authChangesSubscription; @@ -43,138 +38,277 @@ class QuoteListBloc extends Bloc { String? _authenticatedUsername; final QuoteRepository _quoteRepository; - void _registerEventHandler() { + void _registerEventsHandler() { on( - (event, emit) async { - if (event is QuoteListFirstPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + (event, emitter) async { + if (event is QuoteListUsernameObtained) { + await _handleQuoteListUsernameObtained(emitter); + } else if (event is QuoteListFailedFetchRetried) { + await _handleQuoteListFailedFetchRetried(emitter); } else if (event is QuoteListItemUpdated) { - emit( - state.copyWithUpdatedQuote(event.updatedQuote), - ); - } else if (event is QuoteListUserAuthenticationChanged) { - emit( - QuoteListState( - filter: state.filter, - ), - ); - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + _handleQuoteListItemUpdated(emitter, event); } else if (event is QuoteListTagChanged) { - emit( - QuoteListState.loadingNewTag(tag: event.tag), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListTagChanged(emitter, event); } else if (event is QuoteListSearchTermChanged) { - emit( - QuoteListState.loadingNewSearchTerm( - searchTerm: event.searchTerm, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListSearchTermChanged(emitter, event); } else if (event is QuoteListRefreshed) { - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - isRefresh: true, - ), - onData: emit, - ); - } else if (event is QuoteListNewPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - event.pageNumber, - fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, - ), - onData: emit, - ); + await _handleQuoteListRefreshed(emitter, event); + } else if (event is QuoteListNextPageRequested) { + await _handleQuoteListNextPageRequested(emitter, event); } else if (event is QuoteListItemFavoriteToggled) { - try { - final updatedQuote = await (event is QuoteListItemFavorited - ? _quoteRepository.favoriteQuote(event.id) - : _quoteRepository.unfavoriteQuote(event.id)); - final isFilteringByFavorites = - state.filter is QuoteListFilterByFavorites; - if (!isFilteringByFavorites) { - emit( - state.copyWithUpdatedQuote(updatedQuote), - ); - } else { - emit( - QuoteListState( - filter: state.filter, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - ), - onData: emit, - ); - } - } catch (error) { - emit( - state.copyWithFavoriteToggleError(error), - ); - } + await _handleQuoteListItemFavoriteToggled(emitter, event); } else if (event is QuoteListFilterByFavoritesToggled) { - final isFilteringByFavorites = - state.filter is! QuoteListFilterByFavorites; + await _handleQuoteListFilterByFavoritesToggled(emitter); + } + }, + transformer: (eventStream, eventHandler) { + final nonDebounceEventStream = eventStream.where( + (event) => event is! QuoteListSearchTermChanged, + ); - emit( - QuoteListState.loadingToggledFavoritesFilter( - isFilteringByFavorites: isFilteringByFavorites, - ), - ); + final debounceEventStream = eventStream + .whereType() + .debounceTime( + const Duration(seconds: 1), + ) + .where((event) { + final previousFilter = state.filter; + final previousSearchTerm = + previousFilter is QuoteListFilterBySearchTerm + ? previousFilter.searchTerm + : ''; - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: isFilteringByFavorites - ? QuoteListPageFetchPolicy.cacheAndNetwork - : QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); - } + return event.searchTerm != previousSearchTerm; + }); + + final mergedEventStream = MergeStream([ + nonDebounceEventStream, + debounceEventStream, + ]); + + final restartableTransformer = restartable(); + return restartableTransformer(mergedEventStream, eventHandler); }, - transformer: _transformEvents, + ); + } + + Future _handleQuoteListFailedFetchRetried(Emitter emitter) { + // Clears out the error and puts the loading indicator back on the screen. + emitter( + state.copyWithNewError(null), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + void _handleQuoteListItemUpdated( + Emitter emitter, + QuoteListItemUpdated event, + ) { + // Replaces the updated quote in the current state and re-emits it. + emitter( + state.copyWithUpdatedQuote( + event.updatedQuote, + ), + ); + } + + Future _handleQuoteListUsernameObtained(Emitter emitter) { + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListTagChanged( + Emitter emitter, + QuoteListTagChanged event, + ) { + emitter( + QuoteListState.loadingNewTag(tag: event.tag), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *deselecting* a tag, the `cachePreferably` fetch policy + // will return you the cached quotes. If the user is selecting a new tag + // instead, the `cachePreferably` fetch policy won't find any cached + // quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListSearchTermChanged( + Emitter emitter, + QuoteListSearchTermChanged event, + ) { + emitter( + QuoteListState.loadingNewSearchTerm( + searchTerm: event.searchTerm, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *clearing out* the search bar, the `cachePreferably` + // fetch policy will return you the cached quotes. If the user is + // entering a new search instead, the `cachePreferably` fetch policy + // won't find any cached quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListRefreshed( + Emitter emitter, + QuoteListRefreshed event, + ) { + final firstPageFetchStream = _fetchQuotePage( + 1, + // Since the user is asking for a refresh, you don't want to get cached + // quotes, thus the `networkOnly` fetch policy makes the most sense. + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + isRefresh: true, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListNextPageRequested( + Emitter emitter, + QuoteListNextPageRequested event, + ) { + emitter( + state.copyWithNewError(null), + ); + + final nextPageFetchStream = _fetchQuotePage( + event.pageNumber, + // The `networkPreferably` fetch policy prioritizes fetching the new page + // from the server, and, if it fails, try grabbing it from the cache. + fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, + ); + + return emitter.onEach( + nextPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListItemFavoriteToggled( + Emitter emitter, + QuoteListItemFavoriteToggled event, + ) async { + try { + // The `favoriteQuote()` and `unfavoriteQuote()` functions return you the + // updated quote object. + final updatedQuote = await (event is QuoteListItemFavorited + ? _quoteRepository.favoriteQuote( + event.id, + ) + : _quoteRepository.unfavoriteQuote( + event.id, + )); + final isFilteringByFavorites = state.filter is QuoteListFilterByFavorites; + + // If the user isn't filtering by favorites, you just replace the changed + // quote on-screen. + if (!isFilteringByFavorites) { + emitter( + state.copyWithUpdatedQuote( + updatedQuote, + ), + ); + } else { + // If the user *is* filtering by favorites, that means the user is + // actually *removing* a quote from the list, so you refresh the entire + // list to make sure you won't break the pagination. + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + ); + + await emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + } catch (error) { + // If an error happens trying to (un)favorite a quote you attach an error + // to the current state which will result on the screen showing a snackbar + // to the user and possibly taking him to the Sign In screen in case the + // cause is the user being signed out. + emitter( + state.copyWithFavoriteToggleError( + error, + ), + ); + } + } + + Future _handleQuoteListFilterByFavoritesToggled( + Emitter emitter, + ) { + final isFilteringByFavorites = state.filter is! QuoteListFilterByFavorites; + + emitter( + QuoteListState.loadingToggledFavoritesFilter( + isFilteringByFavorites: isFilteringByFavorites, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *adding* the favorites filter, you use the *cacheAndNetwork* + // fetch policy to show the cached data first followed by the updated list + // from the server. + // If the user is *removing* the favorites filter, you simply show the + // cached data they were seeing before applying the filter. + fetchPolicy: isFilteringByFavorites + ? QuoteListPageFetchPolicy.cacheAndNetwork + : QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, ); } @@ -183,83 +317,65 @@ class QuoteListBloc extends Bloc { required QuoteListPageFetchPolicy fetchPolicy, bool isRefresh = false, }) async* { - final filter = state.filter; - final isFilteringByFavorites = filter is QuoteListFilterByFavorites; - if (isFilteringByFavorites && _authenticatedUsername == null) { + final currentlyAppliedFilter = state.filter; + final isFilteringByFavorites = + currentlyAppliedFilter is QuoteListFilterByFavorites; + final isUserSignedIn = _authenticatedUsername != null; + if (isFilteringByFavorites && !isUserSignedIn) { yield QuoteListState.noItemsFound( - filter: state.filter, + filter: currentlyAppliedFilter, ); } else { - yield* _quoteRepository - .getQuoteListPage( + final pagesStream = _quoteRepository.getQuoteListPage( page, - tag: filter is QuoteListFilterByTag ? filter.tag : null, - searchTerm: - filter is QuoteListFilterBySearchTerm ? filter.searchTerm : '', - favoritedByUsername: filter is QuoteListFilterByFavorites - ? _authenticatedUsername + tag: currentlyAppliedFilter is QuoteListFilterByTag + ? currentlyAppliedFilter.tag : null, + searchTerm: currentlyAppliedFilter is QuoteListFilterBySearchTerm + ? currentlyAppliedFilter.searchTerm + : '', + favoritedByUsername: + currentlyAppliedFilter is QuoteListFilterByFavorites + ? _authenticatedUsername + : null, fetchPolicy: fetchPolicy, - ) - .map( - (newPage) { - return newPage.toQuoteListState( - page, - state, - isRefresh: page != state.nextPage, - ); - }, - ).onErrorReturnWith( - (error, _) { - if (error is EmptySearchResultException) { - return QuoteListState.noItemsFound( - filter: state.filter, - ); - } - - if (isRefresh) { - return state.copyWithNewRefreshError( - error, - ); - } else { - return state.copyWithNewError( - error, - ); - } - }, ); - } - } - Stream _transformEvents( - Stream events, - EventMapper mapper, - ) { - final nonDebounceEventStream = events.where( - (event) => event is! QuoteListSearchTermChanged, - ); + try { + await for (final newPage in pagesStream) { + final newItemList = newPage.quoteList; + final oldItemList = state.itemList ?? []; + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); + + final nextPage = newPage.isLastPage ? null : page + 1; + + yield QuoteListState.success( + nextPage: nextPage, + itemList: completeItemList, + filter: currentlyAppliedFilter, + isRefresh: isRefresh, + ); + } + } catch (error) { + if (error is EmptySearchResultException) { + yield QuoteListState.noItemsFound( + filter: currentlyAppliedFilter, + ); + } - final debounceEventStream = events - .whereType() - .debounceTime( - const Duration(seconds: 1), - ) - .where((event) { - final previousFilter = state.filter; - final previousSearchTerm = previousFilter is QuoteListFilterBySearchTerm - ? previousFilter.searchTerm - : ''; - - return event.searchTerm != previousSearchTerm; - }); - - final mergedEventStream = MergeStream([ - nonDebounceEventStream, - debounceEventStream, - ]); - - // Explanation: https://stackoverflow.com/questions/61569917/how-do-i-nest-streams-in-dart-map-streams-to-stream-events - return mergedEventStream.switchMap(mapper); + if (isRefresh) { + yield state.copyWithNewRefreshError( + error, + ); + } else { + yield state.copyWithNewError( + error, + ); + } + } + } } @override @@ -268,23 +384,3 @@ class QuoteListBloc extends Bloc { return super.close(); } } - -extension on QuoteListPage { - QuoteListState toQuoteListState( - int page, - QuoteListState lastState, { - bool isRefresh = false, - }) { - final newItemList = quoteList; - final nextPage = isLastPage ? null : page + 1; - - final oldItemList = lastState.itemList ?? []; - - return QuoteListState.success( - nextPage: nextPage, - itemList: isRefresh ? newItemList : [...oldItemList, ...newItemList], - filter: lastState.filter, - isRefresh: isRefresh, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_event.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_event.dart index 963317fe..f7b7701f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_event.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_event.dart @@ -7,18 +7,10 @@ abstract class QuoteListEvent extends Equatable { List get props => []; } -class QuoteListFirstPageRequested extends QuoteListEvent { - const QuoteListFirstPageRequested(); -} - class QuoteListFilterByFavoritesToggled extends QuoteListEvent { const QuoteListFilterByFavoritesToggled(); } -class QuoteListUserAuthenticationChanged extends QuoteListEvent { - const QuoteListUserAuthenticationChanged(); -} - class QuoteListTagChanged extends QuoteListEvent { const QuoteListTagChanged( this.tag, @@ -49,8 +41,8 @@ class QuoteListRefreshed extends QuoteListEvent { const QuoteListRefreshed(); } -class QuoteListNewPageRequested extends QuoteListEvent { - const QuoteListNewPageRequested({ +class QuoteListNextPageRequested extends QuoteListEvent { + const QuoteListNextPageRequested({ required this.pageNumber, }); @@ -58,11 +50,33 @@ class QuoteListNewPageRequested extends QuoteListEvent { } abstract class QuoteListItemFavoriteToggled extends QuoteListEvent { - const QuoteListItemFavoriteToggled(this.id); + const QuoteListItemFavoriteToggled( + this.id, + ); final int id; } +class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemFavorited( + int id, + ) : super(id); +} + +class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemUnfavorited( + int id, + ) : super(id); +} + +class QuoteListFailedFetchRetried extends QuoteListEvent { + const QuoteListFailedFetchRetried(); +} + +class QuoteListUsernameObtained extends QuoteListEvent { + const QuoteListUsernameObtained(); +} + class QuoteListItemUpdated extends QuoteListEvent { const QuoteListItemUpdated( this.updatedQuote, @@ -70,11 +84,3 @@ class QuoteListItemUpdated extends QuoteListEvent { final Quote updatedQuote; } - -class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemFavorited(int id) : super(id); -} - -class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemUnfavorited(int id) : super(id); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 4ed8d79b..0d4e77a5 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -3,10 +3,12 @@ import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -17,12 +19,14 @@ class QuoteListScreen extends StatelessWidget { required this.quoteRepository, required this.userRepository, required this.onAuthenticationError, + required this.remoteValueService, this.onQuoteSelected, Key? key, }) : super(key: key); final QuoteRepository quoteRepository; final UserRepository userRepository; + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -36,6 +40,7 @@ class QuoteListScreen extends StatelessWidget { child: QuoteListView( onAuthenticationError: onAuthenticationError, onQuoteSelected: onQuoteSelected, + remoteValueService: remoteValueService, ), ); } @@ -44,11 +49,13 @@ class QuoteListScreen extends StatelessWidget { @visibleForTesting class QuoteListView extends StatefulWidget { const QuoteListView({ + required this.remoteValueService, required this.onAuthenticationError, this.onQuoteSelected, Key? key, }) : super(key: key); + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -57,20 +64,22 @@ class QuoteListView extends StatefulWidget { } class _QuoteListViewState extends State { + // For a deep dive on PagingController refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter final PagingController _pagingController = PagingController( firstPageKey: 1, ); final TextEditingController _searchBarController = TextEditingController(); + QuoteListBloc get _bloc => context.read(); + @override void initState() { _pagingController.addPageRequestListener((pageNumber) { final isSubsequentPage = pageNumber > 1; if (isSubsequentPage) { - final bloc = context.read(); - bloc.add( - QuoteListNewPageRequested( + _bloc.add( + QuoteListNextPageRequested( pageNumber: pageNumber, ), ); @@ -78,8 +87,7 @@ class _QuoteListViewState extends State { }); _searchBarController.addListener(() { - final bloc = context.read(); - bloc.add( + _bloc.add( QuoteListSearchTermChanged( _searchBarController.text, ), @@ -130,37 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - final bloc = context.read(); - bloc.add( - const QuoteListRefreshed(), - ); - - final stateChangeFuture = bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), ), - ], - ), + ), + ], ), ), ), diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_state.dart index e8aa3e3b..b2a4a868 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_list_state.dart @@ -1,5 +1,24 @@ part of 'quote_list_bloc.dart'; +/// Holds all data needed to infer the state of the paginated grid of quotes. +/// +/// You don't have to memorize what combination of properties lead to which +/// visual outputs, the [infinite_scroll_pagination](https://github.com/EdsonBueno/infinite_scroll_pagination) +/// package takes care of that. Simply provide the values as you have them and +/// everything will work. +/// +/// For example: +/// 1. If both [itemList] and [error] aren't null, that is, if you have +/// both some quotes and an error at the same time, that means the error occurred +/// trying to fetch a *subsequent* page, therefore, the error indicator should +/// be appended to the bottom of the grid instead of taking the whole screen. +/// 2. If [error] isn't null but [itemList] is, that +/// means the error occurred trying to fetch the *first* page, in which case you +/// want to display the full-screen error indicator since you don't have any +/// quotes to show. +/// 3. If there's no [error], [itemList] has some items and [nextPage] isn't null, +/// that means you haven't fetched all pages yet and therefore a loading indicator +/// should be appended to the bottom of the grid. class QuoteListState extends Equatable { const QuoteListState({ this.itemList, @@ -8,80 +27,113 @@ class QuoteListState extends Equatable { this.filter, this.refreshError, this.favoriteToggleError, - DateTime? fetchTimestamp, - }) : _fetchTimestamp = fetchTimestamp; + }); + /// Holds all of the items from the pages you have loaded so far. final List? itemList; + + /// The next page to be fetched, or `null` if you have already loaded the entire list. + /// + /// Besides determining which page should be asked next, it also determines + /// whether you need a loading indicator at the bottom to indicate you haven't + /// fetched all pages yet. final int? nextPage; + + /// Indicates an error occurred trying to fetch any page of quotes. + /// + /// If both this property and [itemList] holds values, that means the error + /// occurred trying to fetch a subsequent page. If, on the other hand, this + /// property has a value but [itemList] doesn't, that means the error occurred + /// when fetching the first page. final dynamic error; + + /// The currently applied filter (if any). + /// + /// Can be either a tag filter (`QuoteListFilterByTag`), a search filter (`QuoteListFilterBySearchTerm`), + /// or a favorites-only one (`QuoteListFilterByFavorites`). final QuoteListFilter? filter; - final DateTime? _fetchTimestamp; + + /// Indicates an error occurred trying to refresh the list. + /// + /// Used to display a snackbar to indicate the failure. final dynamic refreshError; + + /// Indicates an error occurred trying to favorite a quote. + /// + /// Used to display a snackbar to the user indicating the failure and also + /// redirect them to the Sign In screen in case the cause of the error is the + /// user being signed out. final dynamic favoriteToggleError; - factory QuoteListState.loadingNewTag({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a tag change. + QuoteListState.loadingNewTag({ required Tag? tag, - }) { - return QuoteListState( - filter: tag != null ? QuoteListFilterByTag(tag) : null, - ); - } + }) : this( + filter: tag != null ? QuoteListFilterByTag(tag) : null, + ); - factory QuoteListState.loadingNewSearchTerm({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a search change. + QuoteListState.loadingNewSearchTerm({ required String searchTerm, - }) { - return QuoteListState( - filter: searchTerm.isEmpty - ? null - : QuoteListFilterBySearchTerm( - searchTerm, - ), - ); - } - - factory QuoteListState.loadingToggledFavoritesFilter({ + }) : this( + filter: searchTerm.isEmpty + ? null + : QuoteListFilterBySearchTerm( + searchTerm, + ), + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a change in the favorites-only toggle. + const QuoteListState.loadingToggledFavoritesFilter({ required bool isFilteringByFavorites, - }) { - return QuoteListState( - filter: - isFilteringByFavorites ? const QuoteListFilterByFavorites() : null, - ); - } - - factory QuoteListState.noItemsFound({ + }) : this( + filter: isFilteringByFavorites + ? const QuoteListFilterByFavorites() + : null, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// couldn't find any items for the selected filter. + const QuoteListState.noItemsFound({ required QuoteListFilter? filter, - }) { - return QuoteListState( - itemList: const [], - error: null, - nextPage: 1, - filter: filter, - ); - } - - factory QuoteListState.success({ + }) : this( + itemList: const [], + error: null, + nextPage: 1, + filter: filter, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// has successfully loaded a new page. + const QuoteListState.success({ required int? nextPage, required List itemList, required QuoteListFilter? filter, required bool isRefresh, - }) { - return QuoteListState( - nextPage: nextPage, - itemList: itemList, - filter: filter, - fetchTimestamp: isRefresh ? DateTime.now() : null, - ); - } - - QuoteListState copyWithNewError(dynamic error) => QuoteListState( + }) : this( + nextPage: nextPage, + itemList: itemList, + filter: filter, + ); + + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [error] property. + QuoteListState copyWithNewError( + dynamic error, + ) => + QuoteListState( itemList: itemList, nextPage: nextPage, error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, ); + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [refreshError] property. QuoteListState copyWithNewRefreshError( dynamic refreshError, ) => @@ -91,10 +143,11 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); + /// Auxiliary function that creates a copy of the current state by replacing + /// just the [updatedQuote]. QuoteListState copyWithUpdatedQuote( Quote updatedQuote, ) { @@ -110,11 +163,12 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); } + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [favoriteToggleError] property. QuoteListState copyWithFavoriteToggleError( dynamic favoriteToggleError, ) => @@ -124,7 +178,6 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: favoriteToggleError, ); @@ -134,7 +187,6 @@ class QuoteListState extends Equatable { nextPage, error, filter, - _fetchTimestamp, refreshError, favoriteToggleError, ]; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart deleted file mode 100644 index 8bc9e2c3..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -class QuoteSliverGrid extends StatelessWidget { - static const _gridColumnCount = 2; - - const QuoteSliverGrid({ - required this.pagingController, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final PagingController pagingController; - final QuoteSelected? onQuoteSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final onQuoteSelected = this.onQuoteSelected; - return SliverPadding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - sliver: PagedStaggeredSliverGrid.count( - pagingController: pagingController, - builderDelegate: PagedChildBuilderDelegate( - itemBuilder: (context, quote, index) { - final isFavorite = quote.isFavorite ?? false; - return QuoteCard( - statement: quote.body, - author: quote.author, - isFavorite: isFavorite, - top: const OpeningQuoteSvgAsset(), - bottom: const ClosingQuoteSvgAsset(), - onFavorite: () { - final bloc = context.read(); - bloc.add( - isFavorite - ? QuoteListItemUnfavorited(quote.id) - : QuoteListItemFavorited(quote.id), - ); - }, - onTap: onQuoteSelected != null - ? () async { - final updatedQuote = await onQuoteSelected(quote.id); - if (updatedQuote != null && - updatedQuote.isFavorite != quote.isFavorite) { - final bloc = context.read(); - bloc.add( - QuoteListItemUpdated( - updatedQuote, - ), - ); - } - } - : null, - ); - }, - firstPageErrorIndicatorBuilder: (context) { - return ExceptionIndicator( - onTryAgain: () { - final bloc = context.read(); - bloc.add( - const QuoteListFirstPageRequested(), - ); - }, - ); - }, - ), - crossAxisCount: _gridColumnCount, - crossAxisSpacing: theme.gridSpacing, - mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), - ), - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.lock deleted file mode 100644 index 655120cd..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.lock +++ /dev/null @@ -1,714 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: "direct main" - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.yaml index 3fa692f9..7eef55f0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/quote_list/pubspec.yaml @@ -8,7 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 + bloc_concurrency: ^0.2.0 flutter: sdk: flutter domain_models: @@ -17,11 +18,10 @@ dependencies: path: ../../quote_repository user_repository: path: ../../user_repository - infinite_scroll_pagination: - git: - url: git://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: feature/staggered-grid - rxdart: ^0.27.1 + monitoring: + path: ../../monitoring + infinite_scroll_pagination: ^4.0.0-dev.1 + rxdart: ^0.27.3 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config.json deleted file mode 100644 index 878881fc..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:57.665783Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config_subset deleted file mode 100644 index c1a0684d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins-dependencies deleted file mode 100644 index cc604ca9..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:57.852301","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.packages deleted file mode 100644 index 2e6231e6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:57.632637. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_in:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_cubit.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_cubit.dart index 5db3fc78..fe0f041a 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_cubit.dart @@ -1,3 +1,4 @@ +import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:form_fields/form_fields.dart'; @@ -15,76 +16,88 @@ class SignInCubit extends Cubit { final UserRepository userRepository; void onEmailChanged(String newValue) { - final previousValue = state.email; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - email: shouldValidate - ? Email.dirty( - newValue, - ) - : Email.pure( - newValue, - ), - error: null, + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final shouldValidate = previousEmailState.invalid; + final newEmailState = shouldValidate + ? Email.validated( + newValue, + ) + : Email.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + email: newEmailState, ); - emit(newState); + emit(newScreenState); } - void onPasswordChanged(String newValue) { - final previousValue = state.password; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, - ); + void onEmailUnfocused() { + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final previousEmailValue = previousEmailState.value; - emit(newState); + final newEmailState = Email.validated( + previousEmailValue, + ); + final newScreenState = previousScreenState.copyWith( + email: newEmailState, + ); + emit(newScreenState); } - void onEmailUnfocused() { - final newState = state.copyWith( - email: Email.dirty( - state.email.value, - ), - error: null, + void onPasswordChanged(String newValue) { + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final shouldValidate = previousPasswordState.invalid; + final newPasswordState = shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + password: newPasswordState, ); - emit(newState); + emit(newScreenState); } void onPasswordUnfocused() { - final newState = state.copyWith( - password: Password.dirty( - state.password.value, - ), - error: null, - ); + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final previousPasswordValue = previousPasswordState.value; - emit(newState); + final newPasswordState = Password.validated( + previousPasswordValue, + ); + final newScreenState = previousScreenState.copyWith( + password: newPasswordState, + ); + emit(newScreenState); } void onSubmit() async { - final email = Email.dirty(state.email.value); - final password = Password.dirty(state.password.value); + final email = Email.validated(state.email.value); + final password = Password.validated(state.password.value); + final isFormValid = Formz.validate([ - email, - password, - ]) == - FormzStatus.valid; + email, + password, + ]).isValid; + final newState = state.copyWith( email: email, password: password, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signIn( @@ -92,14 +105,14 @@ class SignInCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error, - status: FormzStatus.submissionFailure, + submissionStatus: error is InvalidCredentialsException + ? SubmissionStatus.invalidCredentialsError + : SubmissionStatus.genericError, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_screen.dart index 51ae1d7a..82ce0da0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_screen.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -38,7 +37,7 @@ class SignInScreen extends StatelessWidget { } @visibleForTesting -class SignInView extends StatefulWidget { +class SignInView extends StatelessWidget { const SignInView({ required this.onSignInSuccess, this.onSignUpTap, @@ -51,10 +50,53 @@ class SignInView extends StatefulWidget { final VoidCallback onSignInSuccess; @override - _SignInViewState createState() => _SignInViewState(); + Widget build(BuildContext context) { + final l10n = SignInLocalizations.of(context); + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + l10n.appBarTitle, + ), + ), + body: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric( + horizontal: Spacing.mediumLarge, + ), + child: _SignInForm( + onSignUpTap: onSignUpTap, + onForgotMyPasswordTap: onForgotMyPasswordTap, + onSignInSuccess: onSignInSuccess, + ), + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignInForm extends StatefulWidget { + const _SignInForm({ + required this.onSignInSuccess, + this.onSignUpTap, + this.onForgotMyPasswordTap, + Key? key, + }) : super(key: key); + + final VoidCallback? onSignUpTap; + final VoidCallback? onForgotMyPasswordTap; + final VoidCallback onSignInSuccess; + + @override + State<_SignInForm> createState() => _SignInFormState(); } -class _SignInViewState extends State { +class _SignInFormState extends State<_SignInForm> { final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -74,22 +116,34 @@ class _SignInViewState extends State { }); } + @override + void dispose() { + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { final l10n = SignInLocalizations.of(context); - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignInSuccess(); return; } - final error = state.error; - if (error != null) { + final hasSubmissionError = state.submissionStatus == + SubmissionStatus.genericError || + state.submissionStatus == SubmissionStatus.invalidCredentialsError; + + if (hasSubmissionError) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( - error is InvalidCredentialsException + state.submissionStatus == SubmissionStatus.invalidCredentialsError ? SnackBar( content: Text( l10n.invalidCredentialsErrorMessage, @@ -99,75 +153,21 @@ class _SignInViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - l10n.appBarTitle, - ), - ), - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.mediumLarge, - ), - child: _SignInForm( - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - onSignUpTap: widget.onSignUpTap, - onForgotMyPasswordTap: widget.onForgotMyPasswordTap, - ), - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); - - @override - void dispose() { - _emailFocusNode.dispose(); - _passwordFocusNode.dispose(); - super.dispose(); - } -} - -class _SignInForm extends StatelessWidget { - const _SignInForm({ - required this.emailFocusNode, - required this.passwordFocusNode, - this.onSignUpTap, - this.onForgotMyPasswordTap, - Key? key, - }) : super(key: key); - - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - - @override - Widget build(BuildContext context) { - final l10n = SignInLocalizations.of(context); - return BlocBuilder( builder: (context, state) { final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final cubit = context.read(); return Column( children: [ TextField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -185,7 +185,7 @@ class _SignInForm extends StatelessWidget { height: Spacing.large, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, obscureText: true, onEditingComplete: cubit.onSubmit, @@ -206,7 +206,8 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.forgotMyPasswordButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onForgotMyPasswordTap, + onPressed: + isSubmissionInProgress ? null : widget.onForgotMyPasswordTap, ), const SizedBox( height: Spacing.small, @@ -232,7 +233,7 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.signUpButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onSignUpTap, + onPressed: isSubmissionInProgress ? null : widget.onSignUpTap, ), ], ); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_state.dart index 226fb0b8..05f6065f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/src/sign_in_state.dart @@ -2,28 +2,24 @@ part of 'sign_in_cubit.dart'; class SignInState extends Equatable { const SignInState({ - this.email = const Email.pure(), - this.password = const Password.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.password = const Password.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; final Password password; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignInState copyWith({ Email? email, Password? password, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignInState( email: email ?? this.email, password: password ?? this.password, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @@ -31,7 +27,23 @@ class SignInState extends Equatable { List get props => [ email, password, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + /// Used when the form has not been sent yet. + idle, + + /// Used to disable all buttons and add a progress indicator to the main one. + inProgress, + + /// Used to close the screen and navigate back to the caller screen. + success, + + /// Used to display a generic snack bar saying that an error has occurred, e.g., no internet connection. + genericError, + + /// Used to show a more specific error telling the user they got the email and/or password wrong. + invalidCredentialsError, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.yaml index 77b2b521..9f15389f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config.json deleted file mode 100644 index ace398b2..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_up", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:01.501790Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config_subset deleted file mode 100644 index 92fa1a33..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins-dependencies deleted file mode 100644 index a689392d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:01.710617","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.packages deleted file mode 100644 index e7732711..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:01.465330. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_up:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_cubit.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_cubit.dart index 767d87b0..1c5749c0 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_cubit.dart @@ -15,97 +15,75 @@ class SignUpCubit extends Cubit { final UserRepository userRepository; - void onUsernameChanged(String newValue) { - final previousUsername = state.username; - final shouldValidate = previousUsername.invalid; - final newState = state.copyWith( - username: shouldValidate - ? Username.dirty( - newValue, - isAlreadyRegistered: newValue == previousUsername.value - ? previousUsername.isAlreadyRegistered - : false, - ) - : Username.pure( - newValue, - ), - error: null, - ); - emit(newState); - } - void onEmailChanged(String newValue) { final previousEmail = state.email; final shouldValidate = previousEmail.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousEmail.value ? previousEmail.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } - void onPasswordChanged(String newValue) { - final previousPassword = state.password; - final shouldValidate = previousPassword.invalid; + void onEmailUnfocused() { final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, + email: Email.validated( + state.email.value, + isAlreadyRegistered: state.email.isAlreadyRegistered, + ), ); emit(newState); } - void onPasswordConfirmationChanged(String newValue) { - final previousPasswordConfirmation = state.passwordConfirmation; - final shouldValidate = previousPasswordConfirmation.invalid; + void onUsernameChanged(String newValue) { + final previousUsername = state.username; + final shouldValidate = previousUsername.invalid; final newState = state.copyWith( - passwordConfirmation: shouldValidate - ? PasswordConfirmation.dirty( + username: shouldValidate + ? Username.validated( newValue, - password: state.password, + isAlreadyRegistered: newValue == previousUsername.value + ? previousUsername.isAlreadyRegistered + : false, ) - : PasswordConfirmation.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); } void onUsernameUnfocused() { final newState = state.copyWith( - username: Username.dirty( + username: Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } - void onEmailUnfocused() { + void onPasswordChanged(String newValue) { + final previousPassword = state.password; + final shouldValidate = previousPassword.invalid; final newState = state.copyWith( - email: Email.dirty( - state.email.value, - isAlreadyRegistered: state.email.isAlreadyRegistered, - ), - error: null, + password: shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ), ); emit(newState); @@ -113,41 +91,59 @@ class SignUpCubit extends Cubit { void onPasswordUnfocused() { final newState = state.copyWith( - password: Password.dirty( + password: Password.validated( state.password.value, ), - error: null, + ); + emit(newState); + } + + void onPasswordConfirmationChanged(String newValue) { + final previousPasswordConfirmation = state.passwordConfirmation; + final shouldValidate = previousPasswordConfirmation.invalid; + final newState = state.copyWith( + passwordConfirmation: shouldValidate + ? PasswordConfirmation.validated( + newValue, + password: state.password, + ) + : PasswordConfirmation.unvalidated( + newValue, + ), ); emit(newState); } void onPasswordConfirmationUnfocused() { final newState = state.copyWith( - passwordConfirmation: PasswordConfirmation.dirty( + passwordConfirmation: PasswordConfirmation.validated( state.passwordConfirmation.value, password: state.password, ), - error: null, ); emit(newState); } void onSubmit() async { - final username = Username.dirty( + final username = Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ); - final email = Email.dirty( + + final email = Email.validated( state.email.value, isAlreadyRegistered: state.email.isAlreadyRegistered, ); - final password = Password.dirty( + + final password = Password.validated( state.password.value, ); - final passwordConfirmation = PasswordConfirmation.dirty( + + final passwordConfirmation = PasswordConfirmation.validated( state.passwordConfirmation.value, password: password, ); + final isFormValid = Formz.validate([ username, email, @@ -155,15 +151,17 @@ class SignUpCubit extends Cubit { passwordConfirmation, ]) == FormzStatus.valid; + final newState = state.copyWith( username: username, email: email, password: password, passwordConfirmation: passwordConfirmation, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signUp( @@ -172,29 +170,27 @@ class SignUpCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) - : null, + : state.username, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) - : null, + : state.email, ); emit(newState); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_screen.dart index ded26ec0..00cc6d8f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_screen.dart @@ -31,7 +31,7 @@ class SignUpScreen extends StatelessWidget { } @visibleForTesting -class SignUpView extends StatefulWidget { +class SignUpView extends StatelessWidget { const SignUpView({ required this.onSignUpSuccess, Key? key, @@ -40,10 +40,46 @@ class SignUpView extends StatefulWidget { final VoidCallback onSignUpSuccess; @override - _SignUpViewState createState() => _SignUpViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + SignUpLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _SignUpForm( + onSignUpSuccess: onSignUpSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignUpForm extends StatefulWidget { + const _SignUpForm({ + required this.onSignUpSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onSignUpSuccess; + + @override + State<_SignUpForm> createState() => _SignUpFormState(); } -class _SignUpViewState extends State { +class _SignUpFormState extends State<_SignUpForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -52,24 +88,40 @@ class _SignUpViewState extends State { @override void initState() { super.initState(); - _usernameFocusNode.addListener(() { - if (!_usernameFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onUsernameUnfocused(); - } - }); + _setUpEmailFieldFocusListener(); + _setUpUsernameFieldFocusListener(); + _setUpPasswordFieldFocusListener(); + _setUpPasswordConfirmationFieldFocusListener(); + } + + void _setUpEmailFieldFocusListener() { _emailFocusNode.addListener(() { if (!_emailFocusNode.hasFocus) { final cubit = context.read(); cubit.onEmailUnfocused(); } }); + } + + void _setUpUsernameFieldFocusListener() { + _usernameFocusNode.addListener(() { + if (!_usernameFocusNode.hasFocus) { + final cubit = context.read(); + cubit.onUsernameUnfocused(); + } + }); + } + + void _setUpPasswordFieldFocusListener() { _passwordFocusNode.addListener(() { if (!_passwordFocusNode.hasFocus) { final cubit = context.read(); cubit.onPasswordUnfocused(); } }); + } + + void _setUpPasswordConfirmationFieldFocusListener() { _passwordConfirmationFocusNode.addListener(() { if (!_passwordConfirmationFocusNode.hasFocus) { final cubit = context.read(); @@ -80,14 +132,16 @@ class _SignUpViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignUpSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -95,114 +149,69 @@ class _SignUpViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - SignUpLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _SignUpForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _SignUpForm extends StatelessWidget { - const _SignUpForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = SignUpLocalizations.of(context); final cubit = context.read(); + final emailError = state.email.invalid ? state.email.error : null; final usernameError = state.username.invalid ? state.username.error : null; - final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final passwordConfirmationError = state.passwordConfirmation.invalid ? state.passwordConfirmation.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; return Column( children: [ TextField( - focusNode: usernameFocusNode, - onChanged: cubit.onUsernameChanged, + focusNode: _emailFocusNode, + onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.person, + Icons.alternate_email, ), enabled: !isSubmissionInProgress, - labelText: l10n.usernameTextFieldLabel, - errorText: usernameError == null + labelText: l10n.emailTextFieldLabel, + errorText: emailError == null ? null - : (usernameError == UsernameValidationError.empty - ? l10n.usernameTextFieldEmptyErrorMessage - : (usernameError == UsernameValidationError.alreadyTaken - ? l10n.usernameTextFieldAlreadyTakenErrorMessage - : l10n.usernameTextFieldInvalidErrorMessage)), + : (emailError == EmailValidationError.empty + ? l10n.emailTextFieldEmptyErrorMessage + : (emailError == EmailValidationError.alreadyRegistered + ? l10n.emailTextFieldAlreadyRegisteredErrorMessage + : l10n.emailTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: emailFocusNode, - onChanged: cubit.onEmailChanged, + focusNode: _usernameFocusNode, + onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.alternate_email, + Icons.person, ), enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null + labelText: l10n.usernameTextFieldLabel, + errorText: usernameError == null ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : (emailError == EmailValidationError.alreadyRegistered - ? l10n.emailTextFieldAlreadyRegisteredErrorMessage - : l10n.emailTextFieldInvalidErrorMessage)), + : (usernameError == UsernameValidationError.empty + ? l10n.usernameTextFieldEmptyErrorMessage + : (usernameError == UsernameValidationError.alreadyTaken + ? l10n.usernameTextFieldAlreadyTakenErrorMessage + : l10n.usernameTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -223,7 +232,7 @@ class _SignUpForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -261,4 +270,13 @@ class _SignUpForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _emailFocusNode.dispose(); + _usernameFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_state.dart index e88ae868..4da10fc1 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/src/sign_up_state.dart @@ -2,46 +2,48 @@ part of 'sign_up_cubit.dart'; class SignUpState extends Equatable { const SignUpState({ - this.username = const Username.pure(), - this.email = const Email.pure(), - this.password = const Password.pure(), - this.passwordConfirmation = const PasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.username = const Username.unvalidated(), + this.password = const Password.unvalidated(), + this.passwordConfirmation = const PasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final Password password; final PasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignUpState copyWith({ - Username? username, Email? email, + Username? username, Password? password, PasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignUpState( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.yaml index 34e25d43..bf170f01 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/sign_up/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config.json deleted file mode 100644 index 410aaca8..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:05.525418Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config_subset deleted file mode 100644 index 85d61e3d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins-dependencies deleted file mode 100644 index e02a1edf..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:05.710740","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.packages b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.packages deleted file mode 100644 index 1ed9c22a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:05.483183. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -update_profile:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_en.arb index 6144c43b..c66d0109 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_en.arb @@ -9,8 +9,8 @@ "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", "emailTextFieldInvalidErrorMessage": "This email is not valid.", "emailTextFieldAlreadyRegisteredErrorMessage": "This email is already registered.", - "passwordTextFieldLabel": "Password", + "passwordTextFieldLabel": "New Password", "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "passwordConfirmationTextFieldLabel": "Password Confirmation", + "passwordConfirmationTextFieldLabel": "New Password Confirmation", "passwordConfirmationTextFieldInvalidErrorMessage": "Your passwords don't match." } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_cubit.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_cubit.dart index cdd5d084..3fedabee 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_cubit.dart @@ -23,16 +23,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( username: shouldValidate - ? Username.dirty( + ? Username.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Username.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); @@ -44,16 +43,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -64,13 +62,12 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid && newValue.isNotEmpty; final newState = currentState.copyWith( password: shouldValidate - ? OptionalPassword.dirty( + ? OptionalPassword.validated( newValue, ) - : OptionalPassword.pure( + : OptionalPassword.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -81,14 +78,13 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( passwordConfirmation: shouldValidate - ? OptionalPasswordConfirmation.dirty( + ? OptionalPasswordConfirmation.validated( newValue, password: currentState.password, ) - : OptionalPasswordConfirmation.pure( + : OptionalPasswordConfirmation.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -96,11 +92,10 @@ class UpdateProfileCubit extends Cubit { void onUsernameUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - username: Username.dirty( + username: Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -108,11 +103,10 @@ class UpdateProfileCubit extends Cubit { void onEmailUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - email: Email.dirty( + email: Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -120,41 +114,39 @@ class UpdateProfileCubit extends Cubit { void onPasswordUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - password: OptionalPassword.dirty( + password: OptionalPassword.validated( currentState.password.value, ), - error: null, ); emit(newState); } void onPasswordConfirmationUnfocused() { final currentState = state as UpdateProfileLoaded; - final confirmation = OptionalPasswordConfirmation.dirty( + final confirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: currentState.password, ); final newState = currentState.copyWith( passwordConfirmation: confirmation, - error: null, ); emit(newState); } void onSubmit() async { final currentState = state as UpdateProfileLoaded; - final username = Username.dirty( + final username = Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ); - final email = Email.dirty( + final email = Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ); - final password = OptionalPassword.dirty( + final password = OptionalPassword.validated( currentState.password.value, ); - final passwordConfirmation = OptionalPasswordConfirmation.dirty( + final passwordConfirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: password, ); @@ -170,9 +162,7 @@ class UpdateProfileCubit extends Cubit { email: email, password: password, passwordConfirmation: passwordConfirmation, - status: - isFormValid ? FormzStatus.submissionInProgress : currentState.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); emit(newState); @@ -184,25 +174,23 @@ class UpdateProfileCubit extends Cubit { password.value, ); final newState = currentState.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = currentState.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) : null, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) @@ -217,8 +205,8 @@ class UpdateProfileCubit extends Cubit { final user = await userRepository.getUser().first; if (user != null) { final newState = UpdateProfileLoaded( - username: Username.pure(user.username), - email: Email.pure(user.email), + username: Username.unvalidated(user.username), + email: Email.unvalidated(user.email), ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_screen.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_screen.dart index fa9a9943..93693318 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_screen.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_screen.dart @@ -31,7 +31,7 @@ class UpdateProfileScreen extends StatelessWidget { } @visibleForTesting -class UpdateProfileView extends StatefulWidget { +class UpdateProfileView extends StatelessWidget { const UpdateProfileView({ required this.onUpdateProfileSuccess, Key? key, @@ -40,10 +40,46 @@ class UpdateProfileView extends StatefulWidget { final VoidCallback onUpdateProfileSuccess; @override - _UpdateProfileViewState createState() => _UpdateProfileViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + UpdateProfileLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _UpdateProfileForm( + onUpdateProfileSuccess: onUpdateProfileSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _UpdateProfileForm extends StatefulWidget { + const _UpdateProfileForm({ + required this.onUpdateProfileSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onUpdateProfileSuccess; + + @override + State<_UpdateProfileForm> createState() => _UpdateProfileFormState(); } -class _UpdateProfileViewState extends State { +class _UpdateProfileFormState extends State<_UpdateProfileForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -80,15 +116,20 @@ class _UpdateProfileViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + (oldState is UpdateProfileLoaded + ? oldState.submissionStatus + : null) != + (newState is UpdateProfileLoaded ? newState.submissionStatus : null), listener: (context, state) { if (state is UpdateProfileLoaded) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onUpdateProfileSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -97,53 +138,6 @@ class _UpdateProfileViewState extends State { } } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - UpdateProfileLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _UpdateProfileForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _UpdateProfileForm extends StatelessWidget { - const _UpdateProfileForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = UpdateProfileLocalizations.of(context); if (state is UpdateProfileLoaded) { @@ -159,10 +153,11 @@ class _UpdateProfileForm extends StatelessWidget { return Column( children: [ TextFormField( - focusNode: usernameFocusNode, + focusNode: _usernameFocusNode, initialValue: state.username.value, onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.person, @@ -183,10 +178,11 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextFormField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, initialValue: state.email.value, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -207,7 +203,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -226,7 +222,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -263,4 +259,13 @@ class _UpdateProfileForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _usernameFocusNode.dispose(); + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_state.dart b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_state.dart index a07c21b5..c6748888 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_state.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/src/update_profile_state.dart @@ -13,48 +13,52 @@ class UpdateProfileInProgress extends UpdateProfileState { class UpdateProfileLoaded extends UpdateProfileState { const UpdateProfileLoaded({ - required this.username, required this.email, - this.password = const OptionalPassword.pure(), - this.passwordConfirmation = const OptionalPasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + required this.username, + this.password = const OptionalPassword.unvalidated(), + this.passwordConfirmation = + const OptionalPasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final OptionalPassword password; final OptionalPasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; - bool get isSubmissionInProgress => status == FormzStatus.submissionInProgress; + bool get isSubmissionInProgress => + submissionStatus == SubmissionStatus.inProgress; UpdateProfileLoaded copyWith({ - Username? username, Email? email, + Username? username, OptionalPassword? password, OptionalPasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return UpdateProfileLoaded( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.yaml index abb39d30..11b78caf 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/features/update_profile/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: @@ -25,4 +25,5 @@ dev_dependencies: flutter_lints: ^1.0.4 flutter: + generate: true uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config.json deleted file mode 100644 index 2dbfbceb..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:32.016162Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config_subset deleted file mode 100644 index d0eeb618..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/package_config_subset +++ /dev/null @@ -1,205 +0,0 @@ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.packages b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.packages deleted file mode 100644 index b96d0db6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/.packages +++ /dev/null @@ -1,57 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:32.000436. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -form_fields:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/form_fields.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/form_fields.dart index d8fcf757..ba899732 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/form_fields.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/form_fields.dart @@ -1,4 +1,5 @@ -export 'package:formz/formz.dart'; +export 'package:formz/formz.dart' + show FormzInput, FormzStatus, Formz, FormzStatusX; export 'src/email.dart'; export 'src/optional_password.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/email.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/email.dart index e0175644..a5933abb 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/email.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/email.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum EmailValidationError { - empty, - invalid, - alreadyRegistered, -} - -class Email extends FormzInput { - const Email.pure([String value = '']) - : isAlreadyRegistered = false, +class Email extends FormzInput + with EquatableMixin { + const Email.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Email.dirty( + const Email.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -22,6 +19,7 @@ class Email extends FormzInput { '([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])' ')|([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})\$', ); + final bool isAlreadyRegistered; @override @@ -36,15 +34,15 @@ class Email extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Email && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum EmailValidationError { + empty, + invalid, + alreadyRegistered, } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password.dart index 9bf657d0..0f230b6e 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password.dart @@ -1,14 +1,18 @@ import 'package:formz/formz.dart'; -enum OptionalPasswordValidationError { - invalid, -} - +/// Represents an optional password field. +/// +/// Useful when the password can or can't be changed, such as in the update +/// profile screen. class OptionalPassword extends FormzInput { - const OptionalPassword.pure([String value = '']) : super.pure(value); + const OptionalPassword.unvalidated([ + String value = '', + ]) : super.pure(value); - const OptionalPassword.dirty([String value = '']) : super.dirty(value); + const OptionalPassword.validated([ + String value = '', + ]) : super.dirty(value); @override OptionalPasswordValidationError? validator(String value) { @@ -19,3 +23,7 @@ class OptionalPassword : OptionalPasswordValidationError.invalid); } } + +enum OptionalPasswordValidationError { + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password_confirmation.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password_confirmation.dart index 5d06ea5c..70365b8c 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/optional_password_confirmation.dart @@ -1,17 +1,19 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum OptionalPasswordConfirmationValidationError { - empty, - invalid, -} - +/// Represents an optional password confirmation field. +/// +/// Used in conjunction with [OptionalPassword] when the password can or can't +/// be changed, such as in the update profile screen. class OptionalPasswordConfirmation - extends FormzInput { - const OptionalPasswordConfirmation.pure([String value = '']) - : password = const OptionalPassword.pure(), + extends FormzInput + with EquatableMixin { + const OptionalPasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const OptionalPassword.unvalidated(), super.pure(value); - const OptionalPasswordConfirmation.dirty( + const OptionalPasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -30,14 +32,14 @@ class OptionalPasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is OptionalPasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum OptionalPasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password.dart index c92b98ec..9ac850ca 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password.dart @@ -1,21 +1,27 @@ import 'package:formz/formz.dart'; -enum PasswordValidationError { - empty, - invalid, -} - class Password extends FormzInput { - const Password.pure([String value = '']) : super.pure(value); + const Password.unvalidated([ + String value = '', + ]) : super.pure(value); - const Password.dirty([String value = '']) : super.dirty(value); + const Password.validated([ + String value = '', + ]) : super.dirty(value); @override PasswordValidationError? validator(String value) { - return value.isEmpty - ? PasswordValidationError.empty - : (value.length >= 5 && value.length <= 120 - ? null - : PasswordValidationError.invalid); + if (value.isEmpty) { + return PasswordValidationError.empty; + } else if (value.length < 5 || value.length > 120) { + return PasswordValidationError.invalid; + } else { + return null; + } } } + +enum PasswordValidationError { + empty, + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password_confirmation.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password_confirmation.dart index 3295c24b..abb485ec 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/password_confirmation.dart @@ -1,17 +1,15 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum PasswordConfirmationValidationError { - empty, - invalid, -} - class PasswordConfirmation - extends FormzInput { - const PasswordConfirmation.pure([String value = '']) - : password = const Password.pure(), + extends FormzInput + with EquatableMixin { + const PasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const Password.unvalidated(), super.pure(value); - const PasswordConfirmation.dirty( + const PasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -28,14 +26,14 @@ class PasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is PasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum PasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/username.dart b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/username.dart index 652b8441..453ec1b8 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/username.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/src/username.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum UsernameValidationError { - empty, - invalid, - alreadyTaken, -} - -class Username extends FormzInput { - const Username.pure([String value = '']) - : isAlreadyRegistered = false, +class Username extends FormzInput + with EquatableMixin { + const Username.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Username.dirty( + const Username.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -34,15 +31,15 @@ class Username extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Username && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum UsernameValidationError { + empty, + invalid, + alreadyTaken, } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.lock deleted file mode 100644 index a4332784..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.lock +++ /dev/null @@ -1,355 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "24.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - formz: - dependency: "direct main" - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.yaml index 33b7a0ea..feed53bc 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/form_fields/pubspec.yaml @@ -5,7 +5,8 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - formz: ^0.4.0 + formz: ^0.4.1 + equatable: ^2.0.3 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config.json deleted file mode 100644 index 277b3d4c..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config.json +++ /dev/null @@ -1,530 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive_generator", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_helper", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:37.801472Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config_subset deleted file mode 100644 index ff03722a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/package_config_subset +++ /dev/null @@ -1,349 +0,0 @@ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins-dependencies deleted file mode 100644 index c99bc08c..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:37.996598","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.packages b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.packages deleted file mode 100644 index d30f69b8..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/.packages +++ /dev/null @@ -1,93 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:37.779715. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -key_value_storage:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/key_value_storage.dart index 17ba9292..d1006080 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/key_value_storage.dart @@ -1,3 +1,3 @@ export 'package:hive/hive.dart'; export 'src/key_value_storage.dart'; -export 'src/models/models.dart'; \ No newline at end of file +export 'src/models/models.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/key_value_storage.dart index fc5c43fa..e527f2cd 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/key_value_storage.dart @@ -1,8 +1,4 @@ -import 'package:hive/hive.dart'; import 'package:key_value_storage/key_value_storage.dart'; -import 'package:key_value_storage/src/models/dark_mode_preference_cm.dart'; -import 'package:key_value_storage/src/models/models.dart'; -import 'package:key_value_storage/src/models/user_cm.dart'; import 'package:meta/meta.dart'; import 'package:path_provider/path_provider.dart'; @@ -23,7 +19,6 @@ class KeyValueStorage { static const _quoteListPagesBoxKey = 'quote-list-pages'; static const _favoriteQuoteListPagesBoxKey = 'favorite-quote-list-pages'; static const _darkModePreferenceBoxKey = 'dark-mode-preference'; - static const _userBoxKey = 'user'; KeyValueStorage({ @visibleForTesting HiveInterface? hive, @@ -32,10 +27,7 @@ class KeyValueStorage { _hive ..registerAdapter(QuoteListPageCMAdapter()) ..registerAdapter(QuoteCMAdapter()) - ..registerAdapter(DarkModePreferenceCMAdapter()) - ..registerAdapter( - UserCMAdapter(), - ); + ..registerAdapter(DarkModePreferenceCMAdapter()); } catch (_) { throw Exception( 'You shouldn\'t have more than one [KeyValueStorage] instance in your ' @@ -57,11 +49,6 @@ class KeyValueStorage { isTemporary: true, ); - Future> get userBox => _openHiveBox( - _userBoxKey, - isTemporary: false, - ); - Future> get darkModePreferenceBox => _openHiveBox( _darkModePreferenceBoxKey, diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/models.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/models.dart index a8daf157..28f9e853 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/models.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/models.dart @@ -1,4 +1,3 @@ +export 'dark_mode_preference_cm.dart'; export 'quote_cm.dart'; export 'quote_list_page_cm.dart'; -export 'dark_mode_preference_cm.dart'; -export 'user_cm.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.dart deleted file mode 100644 index bbd7ab8c..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:hive/hive.dart'; - -part 'user_cm.g.dart'; - -@HiveType(typeId: 2) -class UserCM { - UserCM({ - required this.username, - required this.email, - }); - - @HiveField(0) - final String username; - @HiveField(1) - final String email; -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.g.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.g.dart deleted file mode 100644 index 47959a1e..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/src/models/user_cm.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class UserCMAdapter extends TypeAdapter { - @override - final int typeId = 2; - - @override - UserCM read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return UserCM( - username: fields[0] as String, - email: fields[1] as String, - ); - } - - @override - void write(BinaryWriter writer, UserCM obj) { - writer - ..writeByte(2) - ..writeByte(0) - ..write(obj.username) - ..writeByte(1) - ..write(obj.email); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is UserCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/pubspec.lock deleted file mode 100644 index de687d15..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/pubspec.lock +++ /dev/null @@ -1,604 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - hive: - dependency: "direct main" - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - hive_generator: - dependency: "direct dev" - description: - name: hive_generator - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: "direct main" - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/test/common_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/test/common_test.dart index 94779576..ccc2cf56 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/test/common_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/key_value_storage/test/common_test.dart @@ -8,7 +8,7 @@ import 'package:test/test.dart'; void main() { - test('Forgot my password', (){ + test('Forgot my password', () { // Build our app and trigger a frame. expect(1, 1); }); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config.json deleted file mode 100644 index f74adeae..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:43.824072Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config_subset deleted file mode 100644 index 9e69d3bd..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/package_config_subset +++ /dev/null @@ -1,265 +0,0 @@ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins deleted file mode 100644 index 4d750fc3..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins-dependencies deleted file mode 100644 index 92e7d987..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"linux":[],"windows":[],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]}],"date_created":"2022-04-19 02:26:44.006732","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.packages b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.packages deleted file mode 100644 index bdd96a73..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/.packages +++ /dev/null @@ -1,72 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:43.809316. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -monitoring:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart index 021cc9a5..d2d3fba8 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart @@ -1 +1,8 @@ -export 'src/logger.dart'; +import 'package:firebase_core/firebase_core.dart'; + +export 'src/dynamic_link_service.dart'; +export 'src/analytics_service.dart'; +export 'src/error_reporting_service.dart'; +export 'src/remote_value_service.dart'; + +Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/analytics_service.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/analytics_service.dart new file mode 100644 index 00000000..d6db4664 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/analytics_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseAnalytics]. +class AnalyticsService { + AnalyticsService({ + @visibleForTesting FirebaseAnalytics? analytics, + }) : _analytics = analytics ?? FirebaseAnalytics.instance; + + final FirebaseAnalytics _analytics; + + Future setCurrentScreen(String screenName) { + return _analytics.setCurrentScreen( + screenName: screenName, + ); + } + + Future logEvent({ + required String name, + Map? parameters, + }) { + return _analytics.logEvent( + name: name, + parameters: parameters, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart new file mode 100644 index 00000000..c2b15a41 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart @@ -0,0 +1,60 @@ +import 'dart:async'; + +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:flutter/foundation.dart'; + +export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' + show SocialMetaTagParameters; + +typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); + +/// Wrapper around [FirebaseDynamicLinks]. +class DynamicLinkService { + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; + + DynamicLinkService({ + @visibleForTesting FirebaseDynamicLinks? dynamicLinks, + }) : _dynamicLinks = dynamicLinks ?? FirebaseDynamicLinks.instance; + + final FirebaseDynamicLinks _dynamicLinks; + + Future generateDynamicLinkUrl({ + required String path, + SocialMetaTagParameters? socialMetaTagParameters, + }) async { + final parameters = DynamicLinkParameters( + uriPrefix: _domainUriPrefix, + link: Uri.parse( + '$_domainUriPrefix$path', + ), + androidParameters: const AndroidParameters( + packageName: _androidPackageName, + ), + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, + ), + socialMetaTagParameters: socialMetaTagParameters, + ); + + final shortLink = await _dynamicLinks.buildShortLink(parameters); + return shortLink.shortUrl.toString(); + } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/error_reporting_service.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/error_reporting_service.dart new file mode 100644 index 00000000..e841435a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/error_reporting_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseCrashlytics]. +class ErrorReportingService { + ErrorReportingService({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + final FirebaseCrashlytics _crashlytics; + + Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) { + return _crashlytics.recordFlutterError(flutterErrorDetails); + } + + Future recordError( + dynamic exception, + StackTrace? stack, { + bool fatal = false, + }) { + return _crashlytics.recordError( + exception, + stack, + fatal: fatal, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/logger.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/logger.dart deleted file mode 100644 index 9c58f71d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/logger.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:logger/logger.dart'; - -late Logger log = Logger(level: kDebugMode ? Level.verbose : Level.nothing); - -FirebaseAnalytics analytics = FirebaseAnalytics(); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart new file mode 100644 index 00000000..e80a3554 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -0,0 +1,24 @@ +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseRemoteConfig]. +class RemoteValueService { + static const _gridQuotesViewEnabledKey = 'grid_quotes_view_enabled'; + + RemoteValueService({ + @visibleForTesting FirebaseRemoteConfig? remoteConfig, + }) : _remoteConfig = remoteConfig ?? FirebaseRemoteConfig.instance; + + final FirebaseRemoteConfig _remoteConfig; + + Future load() async { + await _remoteConfig.setDefaults({ + _gridQuotesViewEnabledKey: false, + }); + await _remoteConfig.fetchAndActivate(); + } + + bool get isGridQuotesViewEnabled => _remoteConfig.getBool( + _gridQuotesViewEnabledKey, + ); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.lock deleted file mode 100644 index 374a480d..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.lock +++ /dev/null @@ -1,455 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "8.3.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0+1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logger: - dependency: "direct main" - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.12.13+hotfix.5" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.yaml index d5253b00..9ee1fb00 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/pubspec.yaml @@ -1,5 +1,4 @@ name: monitoring -version: 0.0.1 publish_to: none environment: @@ -8,8 +7,11 @@ environment: dependencies: flutter: sdk: flutter - firebase_analytics: ^8.3.0 - logger: ^1.0.0 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/test/common_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config.json deleted file mode 100644 index 614f6a7a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,452 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:46.745402Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config_subset deleted file mode 100644 index 0ed407e9..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,297 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins-dependencies deleted file mode 100644 index ffbf22f2..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:46.914884","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.packages b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.packages deleted file mode 100644 index de5044e6..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/.packages +++ /dev/null @@ -1,80 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:46.727295. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/pubspec.lock deleted file mode 100644 index df68ba29..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/quote_repository/pubspec.lock +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config.json deleted file mode 100644 index 803c0d46..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,464 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:49.578055Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config_subset deleted file mode 100644 index 60d90212..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,305 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins-dependencies deleted file mode 100644 index 239b631e..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:49.745988","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.packages b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.packages deleted file mode 100644 index e366791a..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/.packages +++ /dev/null @@ -1,82 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:49.551545. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -user_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/cache_to_domain.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/cache_to_domain.dart index 85f78b5a..d989044e 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/cache_to_domain.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/cache_to_domain.dart @@ -13,12 +13,3 @@ extension DarkModePreferenceCMToDomain on DarkModePreferenceCM { } } } - -extension UserCMToDomain on UserCM { - User toDomainModel() { - return User( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/mappers.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/mappers.dart index 529b9b9b..a6836bb8 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/mappers.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/mappers.dart @@ -1,3 +1,3 @@ export 'cache_to_domain.dart'; export 'domain_to_cache.dart'; -export 'remote_to_cache.dart'; +export 'remote_to_domain.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_cache.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_cache.dart deleted file mode 100644 index d10ee8c1..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_cache.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension UserRMToCM on UserRM { - UserCM toCacheModel() { - return UserCM( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_domain.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_domain.dart new file mode 100644 index 00000000..30e42e34 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/mappers/remote_to_domain.dart @@ -0,0 +1,11 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:fav_qs_api/fav_qs_api.dart'; + +extension UserRMToDomain on UserRM { + User toDomainModel() { + return User( + username: username, + email: email, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_local_storage.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_local_storage.dart index 2d22639f..ef246492 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_local_storage.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_local_storage.dart @@ -16,19 +16,4 @@ class UserLocalStorage { final box = await noSqlStorage.darkModePreferenceBox; return box.get(0); } - - Future upsertUser(UserCM user) async { - final box = await noSqlStorage.userBox; - await box.put(0, user); - } - - Future getUser() async { - final box = await noSqlStorage.userBox; - return box.get(0); - } - - Future deleteUser() async { - final box = await noSqlStorage.userBox; - await box.clear(); - } } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_repository.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_repository.dart index d90ed47c..8562502c 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_repository.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_repository.dart @@ -1,4 +1,3 @@ -import 'package:async/async.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:key_value_storage/key_value_storage.dart'; @@ -26,18 +25,6 @@ class UserRepository { final BehaviorSubject _userSubject = BehaviorSubject(); final BehaviorSubject _darkModePreferenceSubject = BehaviorSubject(); - late final AsyncMemoizer _userTokenNormalizationMemoizer = AsyncMemoizer() - ..runOnce( - () async { - // If the app is uninstalled while the user was authenticated, we need to - // manually delete the token from our secure storage, since it persists - // between app installs. - final user = await _localStorage.getUser(); - if (user == null) { - await _secureStorage.deleteUserToken(); - } - }, - ); Future upsertDarkModePreference(DarkModePreference preference) async { await _localStorage.upsertDarkModePreference( @@ -60,23 +47,21 @@ class UserRepository { Future signIn(String email, String password) async { try { - final user = await remoteApi.signIn( + final apiUser = await remoteApi.signIn( email, password, ); - final cacheUser = user.toCacheModel(); - await Future.wait([ - _secureStorage.upsertUserToken( - user.token, - ), - _localStorage.upsertUser( - cacheUser, - ) - ]); + await _secureStorage.upsertUserInfo( + username: apiUser.username, + email: apiUser.email, + token: apiUser.token, + ); + + final domainUser = apiUser.toDomainModel(); _userSubject.add( - cacheUser.toDomainModel(), + domainUser, ); } on InvalidCredentialsFavQsException catch (_) { throw InvalidCredentialsException(); @@ -85,13 +70,35 @@ class UserRepository { Stream getUser() async* { if (!_userSubject.hasValue) { - final cachedUser = await _localStorage.getUser(); - _userSubject.add(cachedUser?.toDomainModel()); + final userInfo = await Future.wait([ + _secureStorage.getUserEmail(), + _secureStorage.getUsername(), + ]); + + final email = userInfo[0]; + final username = userInfo[1]; + + if (email != null && username != null) { + _userSubject.add( + User( + email: email, + username: username, + ), + ); + } else { + _userSubject.add( + null, + ); + } } yield* _userSubject.stream; } + Future getUserToken() { + return _secureStorage.getUserToken(); + } + Future signUp( String username, String email, @@ -104,22 +111,17 @@ class UserRepository { password, ); - final cacheUser = UserCM( + await _secureStorage.upsertUserInfo( username: username, email: email, + token: userToken, ); - await Future.wait([ - _localStorage.upsertUser( - cacheUser, - ), - _secureStorage.upsertUserToken( - userToken, - ), - ]); - _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } catch (error) { if (error is UsernameAlreadyTakenFavQsException) { @@ -142,14 +144,17 @@ class UserRepository { email, newPassword, ); - final cacheUser = UserCM( + + await _secureStorage.upsertUserInfo( username: username, email: email, ); - await _localStorage.upsertUser(cacheUser); _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } on UsernameAlreadyTakenFavQsException catch (_) { throw UsernameAlreadyTakenException(); @@ -158,22 +163,11 @@ class UserRepository { Future signOut() async { await remoteApi.signOut(); - await Future.wait( - [ - _localStorage.deleteUser(), - _secureStorage.deleteUserToken(), - ], - ); + await _secureStorage.deleteUserInfo(); _userSubject.add(null); } Future requestPasswordResetEmail(String email) async { await remoteApi.requestPasswordResetEmail(email); } - - Future getUserToken() async { - await _userTokenNormalizationMemoizer.future; - final userToken = await _secureStorage.getUserToken(); - return userToken; - } } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_secure_storage.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_secure_storage.dart index 57f93b91..f696a44f 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_secure_storage.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/src/user_secure_storage.dart @@ -1,7 +1,9 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class UserSecureStorage { - static const _userTokenKey = 'fav-qs-user-token'; + static const _tokenKey = 'wonder-words-token'; + static const _usernameKey = 'wonder-words-username'; + static const _emailKey = 'wonder-words-email'; const UserSecureStorage({ FlutterSecureStorage? secureStorage, @@ -9,16 +11,48 @@ class UserSecureStorage { final FlutterSecureStorage _secureStorage; - Future upsertUserToken(String token) => _secureStorage.write( - key: _userTokenKey, - value: token, + Future upsertUserInfo({ + required String username, + required String email, + String? token, + }) => + Future.wait([ + _secureStorage.write( + key: _emailKey, + value: email, + ), + _secureStorage.write( + key: _usernameKey, + value: username, + ), + if (token != null) + _secureStorage.write( + key: _tokenKey, + value: token, + ) + ]); + + Future deleteUserInfo() => Future.wait([ + _secureStorage.delete( + key: _tokenKey, + ), + _secureStorage.delete( + key: _usernameKey, + ), + _secureStorage.delete( + key: _emailKey, + ), + ]); + + Future getUserToken() => _secureStorage.read( + key: _tokenKey, ); - Future deleteUserToken() => _secureStorage.delete( - key: _userTokenKey, + Future getUserEmail() => _secureStorage.read( + key: _emailKey, ); - Future getUserToken() => _secureStorage.read( - key: _userTokenKey, + Future getUsername() => _secureStorage.read( + key: _usernameKey, ); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.lock deleted file mode 100644 index 0aaed3e7..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.lock +++ /dev/null @@ -1,527 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/common_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.mocks.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/11-create-your-own-widget-catalog/projects/final/propagate-config-files.sh b/11-create-your-own-widget-catalog/projects/final/propagate-config-files.sh new file mode 100644 index 00000000..e27a6bf9 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/propagate-config-files.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Copyright (c) 2021 Razeware LLC +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# Notwithstanding the foregoing, you may not use, copy, modify, +# merge, publish, distribute, sublicense, create a derivative work, +# and/or sell copies of the Software in any work that is designed, +# intended, or marketed for pedagogical or instructional purposes +# related to programming, coding, application development, or +# information technology. Permission for such use, copying, +# modification, merger, publication, distribution, sublicensing, +# creation of derivative works, or sale is expressly withheld. +# +# This project and source code may use libraries or frameworks +# that are released under various Open-Source licenses. Use of +# those libraries and frameworks are governed by their own +# individual licenses. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +DEBUG=false +if [ "$DEBUG" = true ]; then + STD_OUT=/dev/tty +else + STD_OUT=/dev/null +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + IS_MACOS=true +else + IS_MACOS=false +fi + +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +WANTED_SUBFOLDER_1='.idea' +WANTED_SUBFOLDER_2='.vscode' + +WANTED_SUBFOLDER_3='android/app/src/google-services.json' +WANTED_SUBFOLDER_4='ios/Runner/GoogleService-Info.plist' + +ARR_WANTED=( + "${WANTED_SUBFOLDER_1}" + "${WANTED_SUBFOLDER_2}" + "${WANTED_SUBFOLDER_3}" + "${WANTED_SUBFOLDER_4}" +) + +# Get root directory: /mnt/c/scripts/epidemy/ +ROOT_DIR="$(dirname "$(dirname "$(dirname "$(echo $SCRIPT_DIR)")")")" + +# Double check our core locations aren't empty +[ -z "$ROOT_DIR" ] && echo 'ROOT_DIR variable is unset!' && exit 1 +[ -z "$SCRIPT_DIR" ] && echo 'SCRIPT_DIR variable is unset!' && exit 1 + +# All folders within root (e.g. 01-, 02-, 03-, 04-) +ALL_ROOT=$(find "${ROOT_DIR}" -maxdepth 3 -type d | grep -E '/[0-9]{2}[^/]*/projects/(starter|final|challenge)') + +# Just the folders we care about (not template) +FOLDERS=$(printf "${ALL_ROOT}" | grep -v $(printf ${SCRIPT_DIR})) + +{ + echo + echo ===Found Folders=== + echo '(Template)' $SCRIPT_DIR + echo "${FOLDERS}" + + echo + echo ===Creating Items=== + printf "${FOLDERS}\n" | while read root ; do + + echo $root + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + dest_item="${root}/${wanted}" + dest_dir=$(dirname "${dest_item}") + + # Ensure template file exists + if [[ ! -e "${orig_item}" ]]; then + continue + fi + + # Skip item if there isn't a path to copy destination + if [ ! -d "${dest_dir}" ]; then + printf "\tDestination Directory Missing - ${wanted}\n" + continue + fi + + # =============COPY============= # + if [ "$IS_MACOS" = true ]; then + # Doesn't support -T, uses source trailing / + cp -r "${orig_item}" "${dest_item}" + else + # -T to copy entire folder, instead of contents + cp -rT "${orig_item}" "${dest_item}" + fi + printf "\tCreated! - ${wanted}\n" + # =============COPY============= # + + done + echo + done + + echo + echo ===Issues=== + + # Print an error only if we're missing both + ERR_IF_BOTH_1=( + "/src/google-services.json$" + "/Runner/GoogleService-Info.plist$" + ) + BOTH_MISSING_1=true + + # Print an error only if we're missing both + ERR_IF_BOTH_2=( + ".idea$" + ".vscode$" + ) + BOTH_MISSING_2=true + + # Don't perform basic missing check on these items + # Use this if other checks should be used, e.g. ERR_IF_BOTH + # Uses regex to check, note the $ for EOL and the OR symbol + NO_ERR="\/(src|Runner)\/(GoogleService-Info.plist|google-services.json)$" + NO_ERR="${NO_ERR}|\.(vscode|idea)$" + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_1[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_1 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_1=false + + # End this checker if found a match + [ "$BOTH_MISSING_1" = false ] && break + fi + done + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_2[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_2 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_2=false + + # End this checker if found a match + [ "$BOTH_MISSING_2" = false ] && break + fi + done + + # Don't print missing file error, + # If item path matches NO_ERR pattern + echo ${wanted} | grep -Eq ${NO_ERR} + [ $? -eq 0 ] && continue + + # Generic file missing error + [ ! -e "${orig_item}" ] && echo "${orig_item} Does not exist!" 1>&2 + done + + [ "$BOTH_MISSING_1" = true ] && echo "Your Firebase configuration file(s) couldn’t be found. Please, make sure you have configured at least the dev app for Android or iOS. You won't be able to run the app otherwise." 1>&2 && exit 1 + [ "$BOTH_MISSING_2" = true ] && echo "Your IDE’s custom running configs couldn’t be found. Please, try following the instructions again, or you'll need to run the app from the command line every time by using: flutter run --dart-define=fav-qs-app-token=YOUR_KEY" 1>&2 && exit 1 + +} > $STD_OUT + +echo Done! +exit 0 diff --git a/11-create-your-own-widget-catalog/projects/final/pubspec.lock b/11-create-your-own-widget-catalog/projects/final/pubspec.lock index 6e343e37..803bac5d 100644 --- a/11-create-your-own-widget-catalog/projects/final/pubspec.lock +++ b/11-create-your-own-widget-catalog/projects/final/pubspec.lock @@ -7,35 +7,35 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" bloc: dependency: transitive description: name: bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.2" + version: "8.0.3" + bloc_concurrency: + dependency: transitive + description: + name: bloc_concurrency + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" boolean_selector: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -84,21 +84,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" dio: dependency: transitive description: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -133,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -141,62 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: "direct main" - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.6.6" + firebase_crashlytics: + dependency: transitive + description: + name: firebase_crashlytics + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.4" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.10" firebase_dynamic_links: - dependency: "direct main" + dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" + firebase_remote_config: + dependency: transitive + description: + name: firebase_remote_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + firebase_remote_config_platform_interface: + dependency: transitive + description: + name: firebase_remote_config_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.10" + firebase_remote_config_web: + dependency: transitive + description: + name: firebase_remote_config_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -209,13 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -241,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -279,14 +312,12 @@ packages: name: formz url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" - graphs: + version: "0.4.1" + fuchsia_remote_debug_protocol: dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -294,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" http_parser: dependency: transitive description: @@ -308,22 +332,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - image: + infinite_scroll_pagination: dependency: transitive description: - name: image + name: infinite_scroll_pagination url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" - infinite_scroll_pagination: - dependency: transitive - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -337,14 +357,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -359,55 +379,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: path: "packages/monitoring" relative: true source: path - version: "0.0.1" + version: "0.0.0" nested: dependency: transitive description: @@ -415,27 +421,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: "direct main" - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.1" + version: "0.5.1+1" path_parsing: dependency: transitive description: @@ -449,70 +448,77 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.10" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.14" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "2.0.6" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.4.0" platform: dependency: transitive description: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.2" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" profile_menu: dependency: "direct main" description: @@ -548,69 +554,62 @@ packages: relative: true source: path version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" routemaster: dependency: "direct main" description: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "0.9.5" + version: "1.0.1" rxdart: dependency: transitive description: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.1" + version: "0.27.3" share_plus: dependency: transitive description: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -636,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -658,34 +657,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -699,42 +712,56 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.9" + version: "6.1.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -748,35 +775,42 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.5" + version: "2.5.2" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" + version: "5.3.1" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/11-create-your-own-widget-catalog/projects/final/pubspec.yaml b/11-create-your-own-widget-catalog/projects/final/pubspec.yaml index 7c92d0b7..b2dd1e71 100644 --- a/11-create-your-own-widget-catalog/projects/final/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/final/pubspec.yaml @@ -25,12 +25,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^0.9.5 - firebase: ^9.0.1 - firebase_dynamic_links: ^2.0.7 - package_info: ^2.0.2 - monitoring: - path: packages/monitoring + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -57,17 +52,21 @@ dependencies: path: packages/domain_models component_library: path: packages/component_library + monitoring: + path: packages/monitoring # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter - flutter_launcher_icons: ^0.9.0 flutter_lints: ^1.0.4 - + + flutter_icons: android: true ios: true @@ -83,34 +82,4 @@ 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 - - # To add assets to your application, add an assets section, like this: - assets: - - assets/animations/ - - # 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 + uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/test/example_test.dart b/11-create-your-own-widget-catalog/projects/final/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/final/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/final/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/11-create-your-own-widget-catalog/projects/final/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/.gitmodules b/12-supporting-the-development-lifecycle-with-firebase/projects/final/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/integration_test/app_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Flutter/AppFrameworkInfo.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Flutter/AppFrameworkInfo.plist +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Podfile b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Podfile +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner.xcodeproj/project.pbxproj +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Info.plist index 9065509e..80173535 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Info.plist +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Runner.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/main.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/main.dart index 41ebf968..1daed5a7 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/main.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -18,7 +18,7 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { @@ -87,37 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ ScreenViewObserver( analyticsService: _analyticsService, ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - remoteValueService: widget.remoteValueService, - dynamicLinkService: _dynamicLinkService, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _navigator.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { - _navigator.push(path); + _routerDelegate.push(path); } } @@ -127,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -134,24 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routes.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routes.dart deleted file mode 100644 index 9fca3705..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routes.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - required RemoteValueService remoteValueService, - required DynamicLinkService dynamicLinkService, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - remoteValueService: remoteValueService, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onSignUpTap: () { - navigator.push( - _RoutePaths.signUpPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? '', - ), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '${homePath}sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routing_table.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/11-create-your-own-widget-catalog/projects/final/lib/home_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/tab_container_screen.dart similarity index 92% rename from 11-create-your-own-widget-catalog/projects/final/lib/home_screen.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/11-create-your-own-widget-catalog/projects/final/lib/home_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/closing-quote.svg b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/closing-quote.svg +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/opening-quote.svg b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/opening-quote.svg +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/10-dynamic-theming-and-dark-mode/projects/final/.metadata b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata similarity index 82% rename from 10-dynamic-theming-and-dark-mode/projects/final/.metadata rename to 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata index 56bfc2c4..be0f63d8 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/.metadata +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e channel: stable project_type: app diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/README.md b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/analysis_options.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle.properties b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/settings.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/loader.json b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 79% rename from 11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme rename to 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 9db57791..3db53b6e 100644 --- a/11-create-your-own-widget-catalog/projects/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + buildConfiguration = "Debug"> diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/component_storybook.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/main.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/story_app.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/favicon.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-192.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-512.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 zcmd5=2T+s!lYZ%-(h(2@5fr2dC?F^$C=i-}R6$UX8af(!je;W5yC_|HmujSgN*6?W z3knF*TL1$|?oD*=zPbBVex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/index.html b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/manifest.json b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/exception_indicator.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/exception_indicator.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/quote_card.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/quote_card.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/search_bar.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/search_bar.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/pubspec.yaml index ef623590..d75f7082 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/pubspec.yaml @@ -2,7 +2,7 @@ name: component_library publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/domain_models/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/domain_models/pubspec.yaml index 5ceb1524..b09f3aa3 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/domain_models/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/domain_models/pubspec.yaml @@ -2,7 +2,7 @@ name: domain_models publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: equatable: ^2.0.3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/pubspec.yaml index 33bdf0a1..b8f9e302 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/pubspec.yaml @@ -2,7 +2,7 @@ name: fav_qs_api publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: dio: ^4.0.0 @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/common_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/pubspec.yaml index ee52bc20..fc6d79ab 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/forgot_my_password/pubspec.yaml @@ -2,7 +2,7 @@ name: forgot_my_password publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/pubspec.yaml index c796c6e8..8f33a7c1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/profile_menu/pubspec.yaml @@ -2,7 +2,7 @@ name: profile_menu publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/l10n.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/quote_details.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/quote_details.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/pubspec.yaml index ef369d62..5f16c003 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_details/pubspec.yaml @@ -2,14 +2,14 @@ name: quote_details publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: path: ../../component_library equatable: ^2.0.3 flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/pubspec.yaml index b0383f58..7eef55f0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/pubspec.yaml @@ -2,7 +2,7 @@ name: quote_list publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/pubspec.yaml index 3812d6b2..9f15389f 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/pubspec.yaml @@ -2,7 +2,7 @@ name: sign_in publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/pubspec.yaml index 25f7c6c3..bf170f01 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/sign_up/pubspec.yaml @@ -2,7 +2,7 @@ name: sign_up publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/pubspec.yaml index b1d749c3..11b78caf 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/update_profile/pubspec.yaml @@ -2,7 +2,7 @@ name: update_profile publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/form_fields/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/form_fields/pubspec.yaml index 9ec161e6..feed53bc 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/form_fields/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/form_fields/pubspec.yaml @@ -2,7 +2,7 @@ name: form_fields publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: formz: ^0.4.1 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/key_value_storage/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/key_value_storage/pubspec.yaml index 2f7b3d07..bca9f9c8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/key_value_storage/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/key_value_storage/pubspec.yaml @@ -2,7 +2,7 @@ name: key_value_storage publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: hive: 2.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart index f9c72b46..d2d3fba8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,7 +3,6 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; -export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart index 84afa653..c2b15a41 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,12 +1,18 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; + +export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' + show SocialMetaTagParameters; typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -14,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart deleted file mode 100644 index ef425b50..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/foundation.dart'; - -class ExplicitCrash { - ExplicitCrash({ - @visibleForTesting FirebaseCrashlytics? crashlytics, - }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; - - final FirebaseCrashlytics _crashlytics; - - crashTheApp() { - _crashlytics.crash(); - } -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/pubspec.yaml index 447a2802..9ee1fb00 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/pubspec.yaml @@ -2,17 +2,16 @@ name: monitoring publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: flutter: sdk: flutter - firebase_core: ^1.17.1 - firebase_crashlytics: ^2.8.1 - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^9.1.9 - firebase_remote_config: ^2.0.8 - package_info: ^2.0.2 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/quote_repository/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/quote_repository/pubspec.yaml index dbaa90a4..e01d8c24 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/quote_repository/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/quote_repository/pubspec.yaml @@ -2,7 +2,7 @@ name: quote_repository publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: equatable: ^2.0.3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/pubspec.yaml index fdcb1d4b..6428373a 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/pubspec.yaml @@ -2,7 +2,7 @@ name: user_repository publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: fav_qs_api: @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/common_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.mocks.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.lock b/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.lock index 00980373..803bac5d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.lock +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -77,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -91,7 +98,7 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.4" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -126,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -140,84 +147,91 @@ packages: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "9.1.9" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.1.7" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.4.0+14" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.17.1" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.7" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.7" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.13" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -230,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -255,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -294,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -311,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -337,7 +364,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -358,28 +385,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: @@ -394,20 +421,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -428,56 +448,56 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.14" path_provider_ios: dependency: transitive description: name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -540,7 +560,7 @@ packages: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" rxdart: dependency: transitive description: @@ -554,42 +574,42 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -615,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -650,28 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -685,35 +712,35 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.2" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: @@ -727,14 +754,14 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -749,13 +776,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.4" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -769,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.4.1" + version: "5.3.1" sdks: dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.yaml index b0f56d45..b2dd1e71 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/pubspec.yaml @@ -18,14 +18,14 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^1.0.0 + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/example_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.gitmodules b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/integration_test/app_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Flutter/AppFrameworkInfo.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Flutter/AppFrameworkInfo.plist +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Podfile b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Podfile +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner.xcodeproj/project.pbxproj +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Info.plist index 9065509e..80173535 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Info.plist +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Runner.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/main.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/main.dart index 41ebf968..1daed5a7 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/main.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -18,7 +18,7 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { @@ -87,37 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ ScreenViewObserver( analyticsService: _analyticsService, ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - remoteValueService: widget.remoteValueService, - dynamicLinkService: _dynamicLinkService, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _navigator.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { - _navigator.push(path); + _routerDelegate.push(path); } } @@ -127,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -134,24 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routes.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routes.dart deleted file mode 100644 index 124b8468..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routes.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - required RemoteValueService remoteValueService, - required DynamicLinkService dynamicLinkService, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - remoteValueService: remoteValueService, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onSignUpTap: () { - navigator.push( - _RoutePaths.signUpPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? '', - ), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '${homePath}sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routing_table.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/home_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/tab_container_screen.dart similarity index 92% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/home_screen.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/lib/home_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/closing-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/closing-quote.svg +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/opening-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/opening-quote.svg +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.metadata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata similarity index 82% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.metadata rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata index 56bfc2c4..be0f63d8 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.metadata +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e channel: stable project_type: app diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/README.md b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/settings.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/loader.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/on_off_switch.riv b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/AppDelegate.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/component_storybook.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/main.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/story_app.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/favicon.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-192.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-512.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-maskable-192.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-maskable-512.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/index.html b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/manifest.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/exception_indicator.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/exception_indicator.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/quote_card.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/quote_card.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/search_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/search_bar.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/quote_details.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/quote_details.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/pubspec.yaml index 4ef00398..5f16c003 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_details/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library equatable: ^2.0.3 flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/pubspec.yaml index 34294525..7eef55f0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/quote_list/pubspec.yaml @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/pubspec.yaml index 71824a86..9f15389f 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/pubspec.yaml @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/sign_in_cubit_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/analytics_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/analytics_service.dart index dcc3a202..d6db4664 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/analytics_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/analytics_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; class AnalyticsService { AnalyticsService({ @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); + }) : _analytics = analytics ?? FirebaseAnalytics.instance; final FirebaseAnalytics _analytics; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/dynamic_link_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart index 3adf95c1..e80a3554 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: true, + _gridQuotesViewEnabledKey: false, }); await _remoteConfig.fetchAndActivate(); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/pubspec.yaml index 0bf0e927..9ee1fb00 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/pubspec.yaml @@ -7,13 +7,12 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^8.3.0 - firebase_remote_config: ^2.0.8 - package_info: ^2.0.2 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 - test: ^1.16.8 + test: ^1.16.8 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.mocks.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.lock b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.lock index 0f084c4a..803bac5d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.lock +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -77,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -91,7 +98,7 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.4" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -126,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -134,97 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.2" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.13.1" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.5" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.1" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.5.3" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -237,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -262,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -301,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -308,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -325,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -344,14 +357,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -372,28 +385,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: @@ -408,20 +421,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -442,49 +448,49 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.14" path_provider_ios: dependency: transitive description: name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" petitparser: dependency: transitive description: @@ -554,7 +560,7 @@ packages: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "0.9.5" + version: "1.0.1" rxdart: dependency: transitive description: @@ -568,42 +574,42 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -629,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -664,28 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -699,35 +712,35 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.2" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: @@ -741,14 +754,14 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -762,14 +775,28 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.4" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -785,5 +812,5 @@ packages: source: hosted version: "5.3.1" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.yaml index cfac12ce..b2dd1e71 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^0.9.5 + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/example_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/14-automated-testing/projects/final/.gitmodules b/14-automated-testing/projects/final/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/14-automated-testing/projects/final/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/14-automated-testing/projects/final/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/14-automated-testing/projects/final/ios/Flutter/AppFrameworkInfo.plist +++ b/14-automated-testing/projects/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/14-automated-testing/projects/final/ios/Podfile b/14-automated-testing/projects/final/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/14-automated-testing/projects/final/ios/Podfile +++ b/14-automated-testing/projects/final/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/14-automated-testing/projects/final/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/final/ios/Runner.xcodeproj/project.pbxproj index 7d8f5c28..3053d607 100644 --- a/14-automated-testing/projects/final/ios/Runner.xcodeproj/project.pbxproj +++ b/14-automated-testing/projects/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -30,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -49,10 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -60,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -100,6 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -115,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -143,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -202,6 +193,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -227,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -241,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -277,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -375,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -448,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -523,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/14-automated-testing/projects/final/ios/Runner/Info.plist b/14-automated-testing/projects/final/ios/Runner/Info.plist index a6b6b1b6..80173535 100644 --- a/14-automated-testing/projects/final/ios/Runner/Info.plist +++ b/14-automated-testing/projects/final/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS @@ -43,7 +58,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/14-automated-testing/projects/final/ios/Runner/Runner.entitlements b/14-automated-testing/projects/final/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/14-automated-testing/projects/final/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/14-automated-testing/projects/final/lib/l10n/app_localizations.dart b/14-automated-testing/projects/final/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/14-automated-testing/projects/final/lib/l10n/app_localizations.dart +++ b/14-automated-testing/projects/final/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/lib/l10n/app_localizations_en.dart b/14-automated-testing/projects/final/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/14-automated-testing/projects/final/lib/l10n/app_localizations_en.dart +++ b/14-automated-testing/projects/final/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/14-automated-testing/projects/final/lib/l10n/app_localizations_pt.dart b/14-automated-testing/projects/final/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/14-automated-testing/projects/final/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/14-automated-testing/projects/final/lib/l10n/messages_pt.arb b/14-automated-testing/projects/final/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/14-automated-testing/projects/final/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/lib/main.dart b/14-automated-testing/projects/final/lib/main.dart index 6939b8d7..1daed5a7 100644 --- a/14-automated-testing/projects/final/lib/main.dart +++ b/14-automated-testing/projects/final/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -108,19 +108,22 @@ class _WonderWordsState extends State { ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _routerDelegate.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { _routerDelegate.push(path); } @@ -140,12 +143,17 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, @@ -158,6 +166,12 @@ class _WonderWordsState extends State { }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/14-automated-testing/projects/final/lib/routing_table.dart b/14-automated-testing/projects/final/lib/routing_table.dart index 4f382a06..20f37847 100644 --- a/14-automated-testing/projects/final/lib/routing_table.dart +++ b/14-automated-testing/projects/final/lib/routing_table.dart @@ -92,16 +92,17 @@ Map buildRoutingTable({ onAuthenticationError: () { routerDelegate.push(_PathConstants.signInPath); }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _PathConstants.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, ), ), _PathConstants.signInPath: (_) => MaterialPage( diff --git a/14-automated-testing/projects/final/packages/component_library/assets/closing-quote.svg b/14-automated-testing/projects/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/14-automated-testing/projects/final/packages/component_library/assets/closing-quote.svg +++ b/14-automated-testing/projects/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/assets/opening-quote.svg b/14-automated-testing/projects/final/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/14-automated-testing/projects/final/packages/component_library/assets/opening-quote.svg +++ b/14-automated-testing/projects/final/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/14-automated-testing/projects/final/.metadata b/14-automated-testing/projects/final/packages/component_library/example/.metadata similarity index 82% rename from 14-automated-testing/projects/final/.metadata rename to 14-automated-testing/projects/final/packages/component_library/example/.metadata index 56bfc2c4..be0f63d8 100644 --- a/14-automated-testing/projects/final/.metadata +++ b/14-automated-testing/projects/final/packages/component_library/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e channel: stable project_type: app diff --git a/14-automated-testing/projects/final/packages/component_library/example/README.md b/14-automated-testing/projects/final/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/14-automated-testing/projects/final/packages/component_library/example/analysis_options.yaml b/14-automated-testing/projects/final/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/android/app/build.gradle b/14-automated-testing/projects/final/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/build.gradle b/14-automated-testing/projects/final/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/gradle.properties b/14-automated-testing/projects/final/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/14-automated-testing/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/14-automated-testing/projects/final/packages/component_library/example/android/settings.gradle b/14-automated-testing/projects/final/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/assets/animations/loader.json b/14-automated-testing/projects/final/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv b/14-automated-testing/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Info.plist b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/14-automated-testing/projects/final/packages/component_library/example/lib/component_storybook.dart b/14-automated-testing/projects/final/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/lib/main.dart b/14-automated-testing/projects/final/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart b/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/lib/story_app.dart b/14-automated-testing/projects/final/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/pubspec.yaml b/14-automated-testing/projects/final/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/example/web/favicon.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-192.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-512.png b/14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 zcmd5=2T+s!lYZ%-(h(2@5fr2dC?F^$C=i-}R6$UX8af(!je;W5yC_|HmujSgN*6?W z3knF*TL1$|?oD*=zPbBVex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/web/index.html b/14-automated-testing/projects/final/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/web/manifest.json b/14-automated-testing/projects/final/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/14-automated-testing/projects/final/packages/component_library/lib/src/exception_indicator.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/14-automated-testing/projects/final/packages/component_library/lib/src/exception_indicator.dart +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/quote_card.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/14-automated-testing/projects/final/packages/component_library/lib/src/quote_card.dart +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/14-automated-testing/projects/final/packages/component_library/lib/src/search_bar.dart b/14-automated-testing/projects/final/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/14-automated-testing/projects/final/packages/component_library/lib/src/search_bar.dart +++ b/14-automated-testing/projects/final/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/14-automated-testing/projects/final/packages/component_library/pubspec.yaml b/14-automated-testing/projects/final/packages/component_library/pubspec.yaml index 2575ccb5..d75f7082 100644 --- a/14-automated-testing/projects/final/packages/component_library/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/component_library/pubspec.yaml @@ -10,15 +10,15 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0 - flutter_svg: ^1.1.1+1 + flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index a88db28b..b27b6a3f 100644 --- a/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -4,25 +4,43 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - testWidgets('onTap() callback is executed when tapping on button', - (tester) async { - bool value = false; + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); - await tester.pumpWidget(MaterialApp( - locale: const Locale('en'), - localizationsDelegates: const [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - onTap: () { - value = !value; - }), - ), - )); + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); - await tester.tap(find.byType(FavoriteIconButton)); + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; - expect(value, true); + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); }); - // Challenge } diff --git a/14-automated-testing/projects/final/packages/domain_models/pubspec.yaml b/14-automated-testing/projects/final/packages/domain_models/pubspec.yaml index d50211d8..b09f3aa3 100644 --- a/14-automated-testing/projects/final/packages/domain_models/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/domain_models/pubspec.yaml @@ -8,5 +8,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/14-automated-testing/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/14-automated-testing/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/14-automated-testing/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/14-automated-testing/projects/final/packages/fav_qs_api/pubspec.yaml b/14-automated-testing/projects/final/packages/fav_qs_api/pubspec.yaml index cb7bdab0..b8f9e302 100644 --- a/14-automated-testing/projects/final/packages/fav_qs_api/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/fav_qs_api/pubspec.yaml @@ -15,4 +15,4 @@ dev_dependencies: build_runner: ^2.0.5 json_serializable: ^6.2.0 test: ^1.21.2 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 9bc9a2f9..87cee833 100644 --- a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,14 +1,13 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; import 'package:test/test.dart'; void main() { - test( - 'When sign in call completes successfully, returns an instance of UserRM', - () async { + group('Sign in:', () { final dio = Dio(BaseOptions()); final dioAdapter = DioAdapter(dio: dio); @@ -26,18 +25,38 @@ void main() { password: password, ), ).toJson(); - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"User-Token": "token", "login": "login", "email": "email"}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(await remoteApi.signIn(email, password), isA()); - }); + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); - // Challenge + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); } diff --git a/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/forgot_my_password/pubspec.yaml b/14-automated-testing/projects/final/packages/features/forgot_my_password/pubspec.yaml index 5395f45c..fc6d79ab 100644 --- a/14-automated-testing/projects/final/packages/features/forgot_my_password/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/forgot_my_password/pubspec.yaml @@ -18,9 +18,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/14-automated-testing/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/14-automated-testing/projects/final/packages/features/profile_menu/pubspec.yaml b/14-automated-testing/projects/final/packages/features/profile_menu/pubspec.yaml index 95eb1f48..8f33a7c1 100644 --- a/14-automated-testing/projects/final/packages/features/profile_menu/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/profile_menu/pubspec.yaml @@ -24,9 +24,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/quote_details/l10n.yaml b/14-automated-testing/projects/final/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/14-automated-testing/projects/final/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/quote_details/lib/quote_details.dart b/14-automated-testing/projects/final/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/14-automated-testing/projects/final/packages/features/quote_details/lib/quote_details.dart +++ b/14-automated-testing/projects/final/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/14-automated-testing/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/14-automated-testing/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/14-automated-testing/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/14-automated-testing/projects/final/packages/features/quote_details/pubspec.yaml b/14-automated-testing/projects/final/packages/features/quote_details/pubspec.yaml index cf7a6214..5f16c003 100644 --- a/14-automated-testing/projects/final/packages/features/quote_details/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/quote_details/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart new file mode 100644 index 00000000..5fe4581d --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -0,0 +1,82 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedGridView extends StatelessWidget { + static const _gridColumnCount = 2; + + const QuotePagedGridView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter + child: PagedMasonryGridView.count( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + crossAxisCount: _gridColumnCount, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + ), + ); + } +} diff --git a/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart new file mode 100644 index 00000000..be337863 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -0,0 +1,77 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + child: PagedListView.separated( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + separatorBuilder: (context, index) => + SizedBox(height: theme.gridSpacing)), + ); + } +} diff --git a/14-automated-testing/projects/final/packages/features/quote_list/pubspec.yaml b/14-automated-testing/projects/final/packages/features/quote_list/pubspec.yaml index 9ee3767d..7eef55f0 100644 --- a/14-automated-testing/projects/final/packages/features/quote_list/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/quote_list/pubspec.yaml @@ -20,18 +20,15 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/final/packages/features/sign_in/pubspec.yaml b/14-automated-testing/projects/final/packages/features/sign_in/pubspec.yaml index 0464dbe4..9f15389f 100644 --- a/14-automated-testing/projects/final/packages/features/sign_in/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/sign_in/pubspec.yaml @@ -23,7 +23,7 @@ dev_dependencies: bloc_test: ^9.0.3 mockito: ^5.2.0 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart b/14-automated-testing/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart index e7b9faa5..7f7c74cc 100644 --- a/14-automated-testing/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart +++ b/14-automated-testing/projects/final/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -11,8 +11,8 @@ void main() { 'Emits SignInState with unvalidated email when email is changed for the first time', build: () => SignInCubit(userRepository: MockUserRepository()), act: (cubit) => cubit.onEmailChanged('email@gmail.com'), - expect: () => [ - const SignInState( + expect: () => const [ + SignInState( email: Email.unvalidated( 'email@gmail.com', )) diff --git a/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/final/packages/features/sign_up/pubspec.yaml b/14-automated-testing/projects/final/packages/features/sign_up/pubspec.yaml index 64c8a099..bf170f01 100644 --- a/14-automated-testing/projects/final/packages/features/sign_up/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/sign_up/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/14-automated-testing/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/final/packages/features/update_profile/pubspec.yaml b/14-automated-testing/projects/final/packages/features/update_profile/pubspec.yaml index 18afb6ab..11b78caf 100644 --- a/14-automated-testing/projects/final/packages/features/update_profile/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/features/update_profile/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/final/packages/form_fields/pubspec.yaml b/14-automated-testing/projects/final/packages/form_fields/pubspec.yaml index 2c530e1d..feed53bc 100644 --- a/14-automated-testing/projects/final/packages/form_fields/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/form_fields/pubspec.yaml @@ -9,5 +9,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/key_value_storage/pubspec.yaml b/14-automated-testing/projects/final/packages/key_value_storage/pubspec.yaml index a2e8301e..bca9f9c8 100644 --- a/14-automated-testing/projects/final/packages/key_value_storage/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/key_value_storage/pubspec.yaml @@ -5,11 +5,11 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - hive: ^2.2.3 + hive: 2.0.4 path_provider: ^2.0.2 dev_dependencies: build_runner: ^2.0.5 hive_generator: ^1.1.0 - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart b/14-automated-testing/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/14-automated-testing/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/14-automated-testing/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/14-automated-testing/projects/final/packages/monitoring/pubspec.yaml b/14-automated-testing/projects/final/packages/monitoring/pubspec.yaml index 74362f59..9ee1fb00 100644 --- a/14-automated-testing/projects/final/packages/monitoring/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/monitoring/pubspec.yaml @@ -7,13 +7,12 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 firebase_analytics: ^9.1.12 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 + firebase_remote_config: ^2.0.11 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/quote_repository/pubspec.yaml b/14-automated-testing/projects/final/packages/quote_repository/pubspec.yaml index e4328325..e01d8c24 100644 --- a/14-automated-testing/projects/final/packages/quote_repository/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/quote_repository/pubspec.yaml @@ -14,6 +14,6 @@ dependencies: path: ../domain_models dev_dependencies: - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/user_repository/pubspec.yaml b/14-automated-testing/projects/final/packages/user_repository/pubspec.yaml index 9d8f378e..6428373a 100644 --- a/14-automated-testing/projects/final/packages/user_repository/pubspec.yaml +++ b/14-automated-testing/projects/final/packages/user_repository/pubspec.yaml @@ -12,10 +12,10 @@ dependencies: domain_models: path: ../domain_models rxdart: ^0.27.1 - flutter_secure_storage: ^5.0.2 + flutter_secure_storage: ^4.2.0 dev_dependencies: mockito: ^5.2.0 test: ^1.16.8 - lints: ^2.0.0 + lints: ^1.0.1 build_runner: ^2.0.5 \ No newline at end of file diff --git a/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart b/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart index 9ed8a489..92015d11 100644 --- a/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart +++ b/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart @@ -3,14 +3,24 @@ import 'package:key_value_storage/key_value_storage.dart'; import 'package:test/test.dart'; import 'package:user_repository/src/mappers/mappers.dart'; +// Rund with: flutter test test/mappers_test.dart void main() { - test( - 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', - () { - final preference = DarkModePreferenceCM.alwaysDark; + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; - expect(preference.toDomainModel(), DarkModePreference.alwaysDark); - }); + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; - // Challenge + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); } diff --git a/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart b/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart index 789fcf6a..3b5d574a 100644 --- a/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart @@ -10,9 +10,7 @@ import 'user_repository_test.mocks.dart'; @GenerateMocks([UserSecureStorage]) void main() { - test( - 'When calling getUserToken after successful authentication, return authentication token', - () async { + group('User authentication token:', () { final _userSecureStorage = MockUserSecureStorage(); final _userRepository = UserRepository( @@ -22,10 +20,21 @@ void main() { userTokenSupplier: () => Future.value(), ), ); - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); - expect(await _userRepository.getUserToken(), 'token'); - }); + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - // Challenge + expect(await _userRepository.getUserToken(), null); + }); + }); } diff --git a/14-automated-testing/projects/final/pubspec.lock b/14-automated-testing/projects/final/pubspec.lock index 1c13dcfc..803bac5d 100644 --- a/14-automated-testing/projects/final/pubspec.lock +++ b/14-automated-testing/projects/final/pubspec.lock @@ -7,14 +7,14 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.11" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -84,14 +84,14 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.0.4" dio: dependency: transitive description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -133,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "1.2.1" file: dependency: transitive description: @@ -141,34 +141,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.3" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.4" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: @@ -210,7 +203,14 @@ packages: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: @@ -255,7 +255,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "1.0.4" flutter_localizations: dependency: "direct main" description: flutter @@ -274,14 +274,14 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "1.1.1+1" + version: "0.22.0" flutter_test: dependency: "direct dev" description: flutter @@ -325,29 +325,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.0" infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "670dfebcc104d0a1c376fc982d258ce2b24e2a1b" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" integration_test: dependency: "direct dev" description: flutter @@ -373,7 +364,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.6.0" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -387,28 +378,28 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.0.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -430,62 +421,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.5.1+1" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.2.1" path_provider: dependency: transitive description: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.10" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.16" + version: "2.0.14" path_provider_ios: dependency: transitive description: name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.10" + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.7" + version: "2.1.6" path_provider_macos: dependency: transitive description: @@ -506,14 +490,14 @@ packages: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.0.6" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -548,7 +532,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.0.2" quote_details: dependency: "direct main" description: @@ -583,7 +567,7 @@ packages: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.4" + version: "0.27.3" share_plus: dependency: transitive description: @@ -651,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.7" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -686,35 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" sync_http: dependency: transitive description: name: sync_http url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -728,7 +712,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.1.4" + version: "6.1.2" url_launcher_android: dependency: transitive description: @@ -742,7 +726,7 @@ packages: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.17" + version: "6.0.16" url_launcher_linux: dependency: transitive description: @@ -763,14 +747,14 @@ packages: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.0.5" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.11" url_launcher_windows: dependency: transitive description: @@ -798,7 +782,7 @@ packages: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "8.2.2" + version: "9.0.0" webdriver: dependency: transitive description: @@ -812,7 +796,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.7.0" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -826,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "5.3.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/14-automated-testing/projects/final/pubspec.yaml b/14-automated-testing/projects/final/pubspec.yaml index 664ec376..b2dd1e71 100644 --- a/14-automated-testing/projects/final/pubspec.yaml +++ b/14-automated-testing/projects/final/pubspec.yaml @@ -64,7 +64,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter_icons: diff --git a/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml b/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml deleted file mode 100644 index 4f51699b..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml +++ /dev/null @@ -1,128 +0,0 @@ -name: Test, build and deploy - -on: - pull_request: - branches: - - develop - push: - branches: - - develop - -permissions: read-all - -jobs: - test: - name: Test - runs-on: ubuntu-latest - steps: - - name: Clone Flutter repository with master channel - uses: subosito/flutter-action@v2 - with: - channel: master - - - name: Run flutter doctor - run: flutter doctor -v - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Get all packages and test - run: make get && make testing - - android: - name: Build Android - runs-on: ubuntu-latest - steps: - - name: Clone flutter repository with master channel - uses: subosito/flutter-action@v2 - with: - channel: master - - - name: Run flutter doctor - run: flutter doctor -v - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - - name: Clean, get and lint - run: make clean && make get && make lint - - - name: Build apk - run: flutter build apk - - - name: Firebase App Distribution - uses: wzieba/Firebase-Distribution-Github-Action@v1 - with: - appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} - token: ${{ secrets.FIREBASE_CLI_TOKEN }} - groups: ${{ secrets.TESTERS_GROUPS }} - file: build/app/outputs/flutter-apk/app-release.apk - ios: - name: Build iOS - runs-on: macos-latest - steps: - - name: Install Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '2.7' - - - name: Install Flutter - uses: subosito/flutter-action@v2 - with: - channel: master - - - name: Run flutter doctor - run: flutter doctor -v - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Clean and get packages - run: make clean && make get && make lint && make format - - - name: Install iOS Gems - working-directory: ${{ github.workspace }}/ios - run: bundle install - - - name: Install Pods - working-directory: ${{ github.workspace }}/ios - run: flutter precache --ios && pod install - - - name: Dry build ios app - run: flutter build ios --no-codesign --dart-define=TEXT=${{ secrets.DART_DEFINE_TEXT }} - - - name: Install iOS Certificate and Profile - working-directory: ${{ github.workspace }}/ios - run: bundle exec fastlane install_certificate_and_profile - env: - APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }} - APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }} - APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }} - TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }} - TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }} - GITHUB_AUTHORIZATION_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - - - name: Increment build number - working-directory: ${{ github.workspace }}/ios - run: bundle exec fastlane build_number_incrementing - - - name: Build IPA - working-directory: ${{ github.workspace }}/ios - run: bundle exec fastlane build - env: - BUNDLE_ID: ${{ secrets.BUNDLE_ID }} - PROVISION_PROFILE_NAME: ${{ secrets.PROVISION_PROFILE_NAME }} - - - name: Distribute iOS Beta App - working-directory: ${{ github.workspace }}/ios - run: bundle exec fastlane distribute_ios_app - env: - FIREBASE_CLI_TOKEN: ${{ secrets.FIREBASE_CLI_TOKEN }} - FIREBASE_APP_ID_IOS: ${{ secrets.FIREBASE_APP_ID_IOS }} - IOS_TESTERS: ${{ secrets.TESTERS_GROUPS }} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/.gitmodules b/15-automating-test-executions-and-build-distributions/projects/final/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/15-automating-test-executions-and-build-distributions/projects/final/.metadata b/15-automating-test-executions-and-build-distributions/projects/final/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/15-automating-test-executions-and-build-distributions/projects/final/integration_test/app_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/integration_test/app_test.dart index 797621b9..34c5841f 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/integration_test/app_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/integration_test/app_test.dart @@ -19,6 +19,6 @@ void main() { await tester.pumpAndSettle(); - expect(find.textContaining('life'), findsWidgets); + expect(find.byType(QuoteCard), findsWidgets); }); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Flutter/AppFrameworkInfo.plist b/15-automating-test-executions-and-build-distributions/projects/final/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/Flutter/AppFrameworkInfo.plist +++ b/15-automating-test-executions-and-build-distributions/projects/final/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Gemfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/Gemfile deleted file mode 100644 index cb2111a7..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source "https://rubygems.org" - -gem "fastlane" -gem "xcode-install" -gem "ffi", github: "ffi/ffi" -plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') -eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Podfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/Podfile +++ b/15-automating-test-executions-and-build-distributions/projects/final/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner.xcodeproj/project.pbxproj b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner.xcodeproj/project.pbxproj +++ b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Info.plist b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Info.plist index a6b6b1b6..80173535 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Info.plist +++ b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS @@ -43,7 +58,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Runner.entitlements b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Appfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Appfile deleted file mode 100644 index 18030630..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Appfile +++ /dev/null @@ -1,6 +0,0 @@ -# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app -# apple_id("[[APPLE_ID]]") # Your Apple email address - - -# For more information about the Appfile, see: -# https://docs.fastlane.tools/advanced/#appfile diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Fastfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Fastfile deleted file mode 100644 index 2e8f1c2f..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Fastfile +++ /dev/null @@ -1,102 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# -# For a list of all available plugins, check out -# -# https://docs.fastlane.tools/plugins/available-plugins -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -default_platform(:ios) - -def delete_temp_keychain(name) - delete_keychain( - name: name - ) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db") -end - -def create_temp_keychain(name, password) - create_keychain( - name: name, - password: password, - unlock: false, - timeout: 0 - ) -end - -def ensure_temp_keychain(name, password) - delete_temp_keychain(name) - create_temp_keychain(name, password) -end - - -platform :ios do - desc "iOS Lanes" - lane :install_certificate_and_profile do - - api_key = app_store_connect_api_key( - key_id: ENV["APPLE_KEY_ID"], - issuer_id: ENV["APPLE_ISSUER_ID"], - key_content: ENV["APPLE_KEY_CONTENT"], - duration: 1200, - in_house: false - ) - - keychain_name = ENV["TEMP_KEYCHAIN_USER"] - keychain_password = ENV["TEMP_KEYCHAIN_PASSWORD"] - ensure_temp_keychain(keychain_name, keychain_password) - - match( - type: 'development', - git_basic_authorization: ENV["GIT_AUTHORIZATION_TOKEN"], - keychain_name: keychain_name, - keychain_password: keychain_password, - api_key: api_key - ) - - end - - lane :set_xcode_version do - - increment_build_number - - end - - lane :build do - gym( - workspace: "Runner.xcworkspace", - configuration: "Release", - scheme: "Runner", - export_method: "development", - clean: false, - output_directory: "../build/ios/ipa/", - output_name: "wonder_words.ipa", - export_options: { - provisioningProfiles: { - ENV["BUNDLE_ID"] => ENV["PROVISION_PROFILE_NAME"] - } - } - ) - end - - - - lane :distribute_ios_app do - - firebase_app_distribution( - app: ENV["FIREBASE_APP_ID_IOS"], - groups: ENV["TESTERS_GROUPS"], - release_notes: "Test", - firebase_cli_token: ENV["FIREBASE_CLI_TOKEN"], - ipa_path: "../build/ios/ipa/wonder_words.ipa" - ) - - end - -end \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Matchfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Matchfile deleted file mode 100644 index 6fb09abf..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Matchfile +++ /dev/null @@ -1,13 +0,0 @@ -git_url("https://github.com/vpalcar/ios-certificates.git") - -storage_mode("git") - -type("development") # The default type, can be: appstore, adhoc, enterprise or development - -# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) -# username("user@fastlane.tools") # Your Apple Developer Portal username - -# For all available options run `fastlane match --help` -# Remove the # in the beginning of the line to enable the other options - -# The docs are available on https://docs.fastlane.tools/actions/match diff --git a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Pluginfile b/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Pluginfile deleted file mode 100644 index b18539bc..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/ios/fastlane/Pluginfile +++ /dev/null @@ -1,5 +0,0 @@ -# Autogenerated by fastlane -# -# Ensure this file is checked in to source control! - -gem 'fastlane-plugin-firebase_app_distribution' diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_en.dart b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_en.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/main.dart b/15-automating-test-executions-and-build-distributions/projects/final/lib/main.dart index 6939b8d7..1daed5a7 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/lib/main.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -108,19 +108,22 @@ class _WonderWordsState extends State { ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _routerDelegate.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { _routerDelegate.push(path); } @@ -140,12 +143,17 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, @@ -158,6 +166,12 @@ class _WonderWordsState extends State { }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/15-automating-test-executions-and-build-distributions/projects/final/lib/routing_table.dart b/15-automating-test-executions-and-build-distributions/projects/final/lib/routing_table.dart index 4f382a06..20f37847 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/lib/routing_table.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/lib/routing_table.dart @@ -92,16 +92,17 @@ Map buildRoutingTable({ onAuthenticationError: () { routerDelegate.push(_PathConstants.signInPath); }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _PathConstants.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, ), ), _PathConstants.signInPath: (_) => MaterialPage( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/closing-quote.svg b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/closing-quote.svg +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/opening-quote.svg b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/opening-quote.svg +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata new file mode 100644 index 00000000..be0f63d8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + channel: stable + +project_type: app diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/README.md b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/analysis_options.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/build.gradle b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/build.gradle b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle.properties b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/settings.gradle b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/loader.json b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Info.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/component_storybook.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/main.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/story_app.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/pubspec.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/favicon.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-192.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-512.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-maskable-192.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/icons/Icon-maskable-512.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/index.html b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/manifest.json b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/exception_indicator.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/exception_indicator.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/quote_card.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/quote_card.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/search_bar.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/search_bar.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/l10n.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/quote_details.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/quote_details.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/pubspec.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/pubspec.yaml index 4ef00398..5f16c003 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/pubspec.yaml +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_details/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library equatable: ^2.0.3 flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart new file mode 100644 index 00000000..5fe4581d --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -0,0 +1,82 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedGridView extends StatelessWidget { + static const _gridColumnCount = 2; + + const QuotePagedGridView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter + child: PagedMasonryGridView.count( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + crossAxisCount: _gridColumnCount, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + ), + ); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart new file mode 100644 index 00000000..be337863 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -0,0 +1,77 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + child: PagedListView.separated( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + separatorBuilder: (context, index) => + SizedBox(height: theme.gridSpacing)), + ); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart deleted file mode 100644 index d19db77d..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -class QuoteSliverGrid extends StatelessWidget { - static const _gridColumnCount = 2; - - const QuoteSliverGrid({ - required this.pagingController, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final PagingController pagingController; - final QuoteSelected? onQuoteSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final onQuoteSelected = this.onQuoteSelected; - final bloc = context.read(); - - return SliverPadding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( - pagingController: pagingController, - builderDelegate: PagedChildBuilderDelegate( - itemBuilder: (context, quote, index) { - final isFavorite = quote.isFavorite ?? false; - return QuoteCard( - statement: quote.body, - author: quote.author, - isFavorite: isFavorite, - top: const OpeningQuoteSvgAsset(), - bottom: const ClosingQuoteSvgAsset(), - onFavorite: () { - bloc.add( - isFavorite - ? QuoteListItemUnfavorited(quote.id) - : QuoteListItemFavorited(quote.id), - ); - }, - onTap: onQuoteSelected != null - ? () async { - final updatedQuote = await onQuoteSelected(quote.id); - - if (updatedQuote != null && - updatedQuote.isFavorite != quote.isFavorite) { - bloc.add( - QuoteListItemUpdated( - updatedQuote, - ), - ); - } - } - : null, - ); - }, - firstPageErrorIndicatorBuilder: (context) { - return ExceptionIndicator( - onTryAgain: () { - bloc.add( - const QuoteListFailedFetchRetried(), - ); - }, - ); - }, - ), - crossAxisCount: _gridColumnCount, - crossAxisSpacing: theme.gridSpacing, - mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), - ), - ); - } -} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart deleted file mode 100644 index 0fa8e548..00000000 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ - required this.pagingController, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final PagingController pagingController; - final QuoteSelected? onQuoteSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final onQuoteSelected = this.onQuoteSelected; - final bloc = context.read(); - - return SliverPadding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - sliver: PagedSliverList.separated( - pagingController: pagingController, - builderDelegate: PagedChildBuilderDelegate( - itemBuilder: (context, quote, index) { - final isFavorite = quote.isFavorite ?? false; - return QuoteCard( - statement: quote.body, - author: quote.author, - isFavorite: isFavorite, - top: const OpeningQuoteSvgAsset(), - bottom: const ClosingQuoteSvgAsset(), - onFavorite: () { - bloc.add( - isFavorite - ? QuoteListItemUnfavorited(quote.id) - : QuoteListItemFavorited(quote.id), - ); - }, - onTap: onQuoteSelected != null - ? () async { - final updatedQuote = await onQuoteSelected(quote.id); - - if (updatedQuote != null && - updatedQuote.isFavorite != quote.isFavorite) { - bloc.add( - QuoteListItemUpdated( - updatedQuote, - ), - ); - } - } - : null, - ); - }, - firstPageErrorIndicatorBuilder: (context) { - return ExceptionIndicator( - onTryAgain: () { - bloc.add( - const QuoteListFailedFetchRetried(), - ); - }, - ); - }, - ), - separatorBuilder: (context, index) => - SizedBox(height: theme.gridSpacing)), - ); - } -} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/pubspec.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/pubspec.yaml index 34294525..7eef55f0 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/pubspec.yaml +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/quote_list/pubspec.yaml @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/analytics_service.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/analytics_service.dart index dcc3a202..d6db4664 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/analytics_service.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/analytics_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; class AnalyticsService { AnalyticsService({ @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); + }) : _analytics = analytics ?? FirebaseAnalytics.instance; final FirebaseAnalytics _analytics; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/pubspec.yaml b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/pubspec.yaml index 68d41253..9ee1fb00 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/pubspec.yaml +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/pubspec.yaml @@ -7,12 +7,11 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^8.3.0 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/15-automating-test-executions-and-build-distributions/projects/final/pubspec.lock b/15-automating-test-executions-and-build-distributions/projects/final/pubspec.lock index f99298dd..803bac5d 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/pubspec.lock +++ b/15-automating-test-executions-and-build-distributions/projects/final/pubspec.lock @@ -7,14 +7,14 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -84,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -141,97 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.3" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.4" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.17.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.6" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.12" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -274,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -325,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -342,12 +335,10 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "1a7291cc7d1705f42482d450ecf1f2889ec75ce6" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" integration_test: dependency: "direct dev" description: flutter @@ -366,7 +357,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: @@ -394,21 +385,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -430,20 +421,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -590,42 +574,42 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -658,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -686,35 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" sync_http: dependency: transitive description: name: sync_http url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -791,14 +775,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "9.0.0" webdriver: dependency: transitive description: @@ -828,5 +812,5 @@ packages: source: hosted version: "5.3.1" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" From 8a7a0ebdc451fc8087098bf3a3efe8d8126cc935 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 18:52:41 +0200 Subject: [PATCH 02/30] Chapter 10 starter project updated --- .../projects/starter/.gitmodules | 4 - .../projects/starter/coverage/lcov.info | 0 .../starter/integration_test/app_test.dart | 24 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 +-- .../starter/lib/l10n/app_localizations.dart | 46 +- .../projects/starter/lib/main.dart | 1 - .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 + .../component_library/example}/.metadata | 2 +- .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 + .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 + .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 410 +++++++++ .../example/lib/story_app.dart | 22 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 +++ .../example/web/manifest.json | 35 + .../lib/src/exception_indicator.dart | 1 - .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../lib/src/theme/wonder_theme_data.dart | 2 +- .../packages/component_library/pubspec.lock | 453 ---------- .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../packages/domain_models/pubspec.lock | 341 -------- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../starter/packages/fav_qs_api/pubspec.lock | 502 ----------- .../starter/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../features/forgot_my_password/pubspec.lock | 663 --------------- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.lock | 656 --------------- .../lib/src/quote_details_screen.dart | 1 - .../features/quote_details/pubspec.lock | 738 ---------------- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 1 + .../src/l10n/quote_list_localizations.dart | 45 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 9 +- .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 +- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.lock | 796 ------------------ .../packages/features/quote_list/pubspec.yaml | 5 +- .../packages/features/sign_in/pubspec.lock | 670 --------------- .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../packages/features/sign_up/pubspec.lock | 663 --------------- .../features/update_profile/pubspec.lock | 663 --------------- .../starter/packages/form_fields/pubspec.lock | 348 -------- .../packages/key_value_storage/pubspec.lock | 604 ------------- .../starter/packages/monitoring/pubspec.lock | 488 ----------- .../packages/quote_repository/pubspec.lock | 513 ----------- .../packages/user_repository/pubspec.lock | 527 ------------ .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../projects/starter/pubspec.lock | 87 +- .../projects/starter/pubspec.yaml | 2 + .../projects/starter/test/example_test.dart | 17 + .../projects/starter/test/widget_test.dart | 15 - 139 files changed, 2486 insertions(+), 9004 deletions(-) delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/.gitmodules delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/coverage/lcov.info create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/integration_test/app_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.gitignore rename 10-dynamic-theming-and-dark-mode/projects/starter/{ => packages/component_library/example}/.metadata (82%) create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/README.md create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/analysis_options.yaml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/build.gradle create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/build.gradle create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle.properties create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/settings.gradle create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/main.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/story_app.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/pubspec.yaml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/favicon.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/index.html create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/manifest.json delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/pubspec.lock create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/domain_models/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/common_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/forgot_my_password/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/pubspec.lock rename 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.lock create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/widget_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_up/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/update_profile/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/form_fields/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/key_value_storage/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/quote_repository/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.lock delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/common_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/test/example_test.dart delete mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/test/widget_test.dart diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/.gitmodules b/10-dynamic-theming-and-dark-mode/projects/starter/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/coverage/lcov.info b/10-dynamic-theming-and-dark-mode/projects/starter/coverage/lcov.info deleted file mode 100644 index e69de29b..00000000 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/integration_test/app_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/ios/Flutter/AppFrameworkInfo.plist b/10-dynamic-theming-and-dark-mode/projects/starter/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/ios/Flutter/AppFrameworkInfo.plist +++ b/10-dynamic-theming-and-dark-mode/projects/starter/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/ios/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/starter/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/10-dynamic-theming-and-dark-mode/projects/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/lib/l10n/app_localizations.dart b/10-dynamic-theming-and-dark-mode/projects/starter/lib/l10n/app_localizations.dart index 910b586a..e47fb9f9 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/lib/l10n/app_localizations.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/lib/l10n/app_localizations.dart @@ -8,14 +8,14 @@ import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_pt.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -60,8 +60,7 @@ import 'app_localizations_pt.dart'; /// be consistent with the languages listed in the AppLocalizations.supportedLocales /// property. abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; @@ -69,8 +68,7 @@ abstract class AppLocalizations { return Localizations.of(context, AppLocalizations)!; } - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +80,7 @@ abstract class AppLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -109,8 +106,7 @@ abstract class AppLocalizations { String get profileBottomNavigationBarItemLabel; } -class _AppLocalizationsDelegate - extends LocalizationsDelegate { +class _AppLocalizationsDelegate extends LocalizationsDelegate { const _AppLocalizationsDelegate(); @override @@ -119,25 +115,25 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; } AppLocalizations lookupAppLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return AppLocalizationsEn(); - case 'pt': - return AppLocalizationsPt(); + case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/lib/main.dart b/10-dynamic-theming-and-dark-mode/projects/starter/lib/main.dart index 68375c51..80b25808 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/lib/main.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/lib/main.dart @@ -4,7 +4,6 @@ import 'dart:isolate'; import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/closing-quote.svg b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/closing-quote.svg +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/opening-quote.svg b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/opening-quote.svg +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/10-dynamic-theming-and-dark-mode/projects/starter/.metadata b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata similarity index 82% rename from 10-dynamic-theming-and-dark-mode/projects/starter/.metadata rename to 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata index 56bfc2c4..be0f63d8 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/.metadata +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e channel: stable project_type: app diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/README.md b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/analysis_options.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/build.gradle b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/build.gradle b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle.properties b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/settings.gradle b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/loader.json b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Info.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/component_storybook.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/main.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..df49d89d --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,410 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/story_app.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/favicon.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-192.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-512.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/index.html b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/manifest.json b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/exception_indicator.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/exception_indicator.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/quote_card.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/quote_card.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/search_bar.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/search_bar.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart index 50e96b19..cbf23acb 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart @@ -73,7 +73,7 @@ class LightWonderThemeData extends WonderThemeData { } class DarkWonderThemeData extends WonderThemeData { - // TODO: Add dark theme implementation for materialThemeData +// TODO: Add dark theme implementation for materialThemeData @override ThemeData get materialThemeData => ThemeData(); diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/pubspec.lock deleted file mode 100644 index 2a449518..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/pubspec.lock +++ /dev/null @@ -1,453 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/domain_models/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/domain_models/pubspec.lock deleted file mode 100644 index c8257f2f..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/domain_models/pubspec.lock +++ /dev/null @@ -1,341 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.lock deleted file mode 100644 index 050431ab..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.10" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.2" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.18.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.5" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.4" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/common_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/forgot_my_password/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/forgot_my_password/pubspec.lock deleted file mode 100644 index baa95ca8..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/forgot_my_password/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: transitive - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index edc70fb0..89db733f 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/pubspec.lock deleted file mode 100644 index e5faddfa..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/profile_menu/pubspec.lock +++ /dev/null @@ -1,656 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart index 4a299464..c4242afc 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/pubspec.lock deleted file mode 100644 index d1e133dc..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_details/pubspec.lock +++ /dev/null @@ -1,738 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.10" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.3" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.0" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.10.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb index 2c14fe76..95d9446b 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", "lifeTagLabel": "Vida", "happinessTagLabel": "Felicidade", "workTagLabel": "Trabalho", diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 2779e237..2c7c3736 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -60,18 +61,15 @@ import 'quote_list_localizations_pt.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -83,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -103,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -146,36 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en', 'pt'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); - case 'pt': - return QuoteListLocalizationsPt(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart index 35866a86..31101779 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for Portuguese (`pt`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsPt extends QuoteListLocalizations { QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; @override String get lifeTagLabel => 'Vida'; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.lock deleted file mode 100644 index 37ecf0da..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.lock +++ /dev/null @@ -1,796 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - bloc_concurrency: - dependency: "direct main" - description: - name: bloc_concurrency - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase_analytics: - dependency: transitive - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.2" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.3" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - firebase_crashlytics: - dependency: transitive - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.5" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.11" - firebase_dynamic_links: - dependency: transitive - description: - name: firebase_dynamic_links - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.2" - firebase_dynamic_links_platform_interface: - dependency: transitive - description: - name: firebase_dynamic_links_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.3+7" - firebase_remote_config: - dependency: transitive - description: - name: firebase_remote_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.11" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: "direct main" - description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - monitoring: - dependency: "direct main" - description: - path: "../../monitoring" - relative: true - source: path - version: "0.0.0" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.yaml index 34294525..7eef55f0 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/quote_list/pubspec.yaml @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.lock deleted file mode 100644 index 0d3d74b6..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.lock +++ /dev/null @@ -1,670 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.20.2" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.11" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.yaml index 71824a86..ad03a384 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/pubspec.yaml @@ -20,9 +20,10 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 flutter: - uses-material-design: true \ No newline at end of file + uses-material-design: true diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_up/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_up/pubspec.lock deleted file mode 100644 index c8f59e47..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/sign_up/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/update_profile/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/update_profile/pubspec.lock deleted file mode 100644 index c8f59e47..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/features/update_profile/pubspec.lock +++ /dev/null @@ -1,663 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "41.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.5.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/form_fields/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/form_fields/pubspec.lock deleted file mode 100644 index b626dbbc..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/form_fields/pubspec.lock +++ /dev/null @@ -1,348 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - formz: - dependency: "direct main" - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/key_value_storage/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/key_value_storage/pubspec.lock deleted file mode 100644 index 7dc62f20..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/key_value_storage/pubspec.lock +++ /dev/null @@ -1,604 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "38.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "3.4.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.10" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.3" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.3" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: "direct main" - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - hive_generator: - dependency: "direct dev" - description: - name: hive_generator - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: "direct main" - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.2" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.2" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/pubspec.lock deleted file mode 100644 index 2fa251d8..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/pubspec.lock +++ /dev/null @@ -1,488 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "9.2.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.2" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.3" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - firebase_crashlytics: - dependency: "direct main" - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.5" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.11" - firebase_dynamic_links: - dependency: "direct main" - description: - name: firebase_dynamic_links - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.2" - firebase_dynamic_links_platform_interface: - dependency: transitive - description: - name: firebase_dynamic_links_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.3+7" - firebase_remote_config: - dependency: "direct main" - description: - name: firebase_remote_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.11" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=1.20.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/quote_repository/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/quote_repository/pubspec.lock deleted file mode 100644 index 36be18ff..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/quote_repository/pubspec.lock +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.lock deleted file mode 100644 index 3abec2a7..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.lock +++ /dev/null @@ -1,527 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "39.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.9.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.6" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.4" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.2" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.21.1" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.13" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "8.2.2" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/common_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.lock b/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.lock index eb69273c..803bac5d 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.lock +++ b/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -237,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -262,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -301,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -318,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "1a7291cc7d1705f42482d450ecf1f2889ec75ce6" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -365,21 +385,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -407,7 +427,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -477,7 +497,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -622,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -650,21 +670,28 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: @@ -749,13 +776,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.6.1" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -769,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.4.1" + version: "5.3.1" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.yaml b/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.yaml index f154f50d..b2dd1e71 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.yaml +++ b/10-dynamic-theming-and-dark-mode/projects/starter/pubspec.yaml @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/test/example_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/10-dynamic-theming-and-dark-mode/projects/starter/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From 282e70d71e177f974a20f9d79ce98fe1674b7a9a Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 19:54:02 +0200 Subject: [PATCH 03/30] Changing remote config value to true by default (grid view by default) --- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../final/packages/monitoring/lib/src/remote_value_service.dart | 2 +- .../packages/monitoring/lib/src/remote_value_service.dart | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/06-authenticating-users/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/06-authenticating-users/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/06-authenticating-users/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/06-authenticating-users/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/06-authenticating-users/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/06-authenticating-users/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/06-authenticating-users/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/06-authenticating-users/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/08-deep-linking/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/08-deep-linking/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/08-deep-linking/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/08-deep-linking/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/08-deep-linking/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/08-deep-linking/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/08-deep-linking/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/08-deep-linking/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/14-automated-testing/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/14-automated-testing/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart +++ b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/14-automated-testing/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/14-automated-testing/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/14-automated-testing/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/14-automated-testing/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/14-automated-testing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/14-automated-testing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/14-automated-testing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/14-automated-testing/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/remote_value_service.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/remote_value_service.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/remote_value_service.dart index e80a3554..3adf95c1 100644 --- a/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -13,7 +13,7 @@ class RemoteValueService { Future load() async { await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: false, + _gridQuotesViewEnabledKey: true, }); await _remoteConfig.fetchAndActivate(); } From 710328a36c00e4247b981d23281f40963c537c9f Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 20:22:45 +0200 Subject: [PATCH 04/30] Storybook issue resolved --- .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ .../final/packages/component_library/example/lib/stories.dart | 4 ++++ 26 files changed, 104 insertions(+) diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/lib/stories.dart b/01-setting-up-your-environment/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/lib/stories.dart +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/lib/stories.dart b/01-setting-up-your-environment/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/01-setting-up-your-environment/projects/starter/packages/component_library/example/lib/stories.dart +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/lib/stories.dart b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/lib/stories.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/lib/stories.dart b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/lib/stories.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/lib/stories.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/lib/stories.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/lib/stories.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/lib/stories.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/lib/stories.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/lib/stories.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/lib/stories.dart b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/lib/stories.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/lib/stories.dart b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/lib/stories.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/lib/stories.dart b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/lib/stories.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/lib/stories.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/lib/stories.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/06-authenticating-users/projects/final/packages/component_library/example/lib/stories.dart b/06-authenticating-users/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/06-authenticating-users/projects/final/packages/component_library/example/lib/stories.dart +++ b/06-authenticating-users/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/lib/stories.dart b/06-authenticating-users/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/06-authenticating-users/projects/starter/packages/component_library/example/lib/stories.dart +++ b/06-authenticating-users/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/lib/stories.dart b/07-routing-and-navigating/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/07-routing-and-navigating/projects/final/packages/component_library/example/lib/stories.dart +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/08-deep-linking/projects/final/packages/component_library/example/lib/stories.dart b/08-deep-linking/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/08-deep-linking/projects/final/packages/component_library/example/lib/stories.dart +++ b/08-deep-linking/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/08-deep-linking/projects/starter/packages/component_library/example/lib/stories.dart b/08-deep-linking/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/08-deep-linking/projects/starter/packages/component_library/example/lib/stories.dart +++ b/08-deep-linking/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/lib/stories.dart b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/lib/stories.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/lib/stories.dart b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/lib/stories.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart index ba803640..f292aded 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart @@ -131,6 +131,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart b/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart +++ b/14-automated-testing/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart index df49d89d..84b8d902 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/lib/stories.dart @@ -117,6 +117,10 @@ List getStories(WonderThemeData theme) { builder: (_, k) => UpvoteIconButton( count: k.sliderInt( label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, ), onTap: () {}, isUpvoted: k.boolean( From 401c749e38fcf40976ad0620a20b03bc6271c101 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 20:49:46 +0200 Subject: [PATCH 05/30] Materials for starter chapter 11 updated --- .../starter/.dart_tool/package_config.json | 686 --------------- .../starter/.dart_tool/package_config_subset | 453 ---------- .../projects/starter/.dart_tool/version | 1 - .../projects/starter/.flutter-plugins | 20 - .../starter/.flutter-plugins-dependencies | 1 - .../projects/starter/.gitignore | 126 +++ .../projects/starter/.idea/.gitignore | 2 - .../starter/.idea/libraries/Dart_Packages.xml | 824 ------------------ .../starter/.idea/libraries/Dart_SDK.xml | 28 - .../.idea/libraries/Flutter_Plugins.xml | 7 - .../projects/starter/.idea/misc.xml | 6 - .../projects/starter/.idea/modules.xml | 8 - .../projects/starter/.idea/workspace.xml | 104 --- .../projects/starter/.keep | 0 .../projects/starter/.packages | 119 --- .../projects/starter/.vscode/launch.json | 56 -- .../projects/starter/README.md | 16 - .../projects/starter/android/.idea/.gitignore | 2 - .../starter/android/.idea/compiler.xml | 6 - .../projects/starter/android/.idea/gradle.xml | 28 - .../starter/android/.idea/jarRepositories.xml | 35 - .../projects/starter/android/.idea/misc.xml | 9 - .../starter/android/.idea/modules.xml | 18 - .../starter/android/.idea/workspace.xml | 119 --- .../projects/starter/android/app/build.gradle | 18 +- .../android/app/src/dev/google-services.json | 47 - .../src/dev/res/mipmap-hdpi/launcher_icon.png | Bin 3432 -> 0 bytes .../src/dev/res/mipmap-mdpi/launcher_icon.png | Bin 2232 -> 0 bytes .../dev/res/mipmap-xhdpi/launcher_icon.png | Bin 4564 -> 0 bytes .../dev/res/mipmap-xxhdpi/launcher_icon.png | Bin 6570 -> 0 bytes .../dev/res/mipmap-xxxhdpi/launcher_icon.png | Bin 8943 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../android/app/src/prod/google-services.json | 39 - .../prod/res/mipmap-hdpi/launcher_icon.png | Bin 2606 -> 0 bytes .../prod/res/mipmap-mdpi/launcher_icon.png | Bin 1671 -> 0 bytes .../prod/res/mipmap-xhdpi/launcher_icon.png | Bin 3496 -> 0 bytes .../prod/res/mipmap-xxhdpi/launcher_icon.png | Bin 5155 -> 0 bytes .../prod/res/mipmap-xxxhdpi/launcher_icon.png | Bin 7091 -> 0 bytes .../projects/starter/android/build.gradle | 3 +- .../starter/assets/animations/loader.json | 1 - .../assets/animations/on_off_switch.riv | Bin 3955 -> 0 bytes .../starter/assets/logos/logo-dev.png | Bin 12084 -> 0 bytes .../projects/starter/assets/logos/logo.png | Bin 9867 -> 0 bytes .../projects/starter/coverage/lcov.info | 208 ----- .../starter/flutter_launcher_icons-dev.yaml | 5 - .../starter/flutter_launcher_icons-prod.yaml | 5 - .../starter/integration_test/app_test.dart | 24 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/starter/ios/Podfile | 2 +- .../projects/starter/ios/Podfile.lock | 180 ---- .../ios/Runner.xcodeproj/project.pbxproj | 593 ++----------- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../xcshareddata/xcschemes/dev.xcscheme | 78 -- .../xcshareddata/xcschemes/prod.xcscheme | 87 -- .../AppIcon-dev-1024x1024@1x.png | Bin 68393 -> 0 bytes .../AppIcon-dev-20x20@1x.png | Bin 645 -> 0 bytes .../AppIcon-dev-20x20@2x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-20x20@3x.png | Bin 2159 -> 0 bytes .../AppIcon-dev-29x29@1x.png | Bin 994 -> 0 bytes .../AppIcon-dev-29x29@2x.png | Bin 2101 -> 0 bytes .../AppIcon-dev-29x29@3x.png | Bin 3105 -> 0 bytes .../AppIcon-dev-40x40@1x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-40x40@2x.png | Bin 2861 -> 0 bytes .../AppIcon-dev-40x40@3x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@2x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@3x.png | Bin 5577 -> 0 bytes .../AppIcon-dev-76x76@1x.png | Bin 2674 -> 0 bytes .../AppIcon-dev-76x76@2x.png | Bin 4599 -> 0 bytes .../AppIcon-dev-83.5x83.5@2x.png | Bin 5040 -> 0 bytes .../AppIcon-dev.appiconset/Contents.json | 1 - .../AppIcon-prod-1024x1024@1x.png | Bin 45287 -> 0 bytes .../AppIcon-prod-20x20@1x.png | Bin 480 -> 0 bytes .../AppIcon-prod-20x20@2x.png | Bin 982 -> 0 bytes .../AppIcon-prod-20x20@3x.png | Bin 1478 -> 0 bytes .../AppIcon-prod-29x29@1x.png | Bin 689 -> 0 bytes .../AppIcon-prod-29x29@2x.png | Bin 1460 -> 0 bytes .../AppIcon-prod-29x29@3x.png | Bin 2122 -> 0 bytes .../AppIcon-prod-40x40@1x.png | Bin 982 -> 0 bytes .../AppIcon-prod-40x40@2x.png | Bin 1945 -> 0 bytes .../AppIcon-prod-40x40@3x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@2x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@3x.png | Bin 3743 -> 0 bytes .../AppIcon-prod-76x76@1x.png | Bin 1839 -> 0 bytes .../AppIcon-prod-76x76@2x.png | Bin 3099 -> 0 bytes .../AppIcon-prod-83.5x83.5@2x.png | Bin 3369 -> 0 bytes .../AppIcon-prod.appiconset/Contents.json | 122 --- .../projects/starter/ios/Runner/Info.plist | 17 + .../starter/ios/Runner/Runner.entitlements | 10 + .../projects/starter/ios/config/dev/.ignore | 0 .../ios/config/dev/GoogleService-Info.plist | 34 - .../projects/starter/ios/config/prod/.ignore | 0 .../ios/config/prod/GoogleService-Info.plist | 34 - .../projects/starter/lib/dynamic_link.dart | 37 - .../lib/generated_plugin_registrant.dart | 22 - .../starter/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../projects/starter/lib/l10n/messages_pt.arb | 4 + .../projects/starter/lib/main.dart | 128 ++- .../projects/starter/lib/routes.dart | 169 ---- .../projects/starter/lib/routing_table.dart | 174 ++++ .../starter/lib/screen_view_observer.dart | 41 +- ..._screen.dart => tab_container_screen.dart} | 4 +- .../projects/starter/makefile | 23 + .../.dart_tool/package_config.json | 1 - .../.dart_tool/package_config_subset | 293 ------- .../component_library/.dart_tool/version | 1 - .../packages/component_library/.packages | 79 -- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 17 +- .../example/lib/component_storybook.dart | 10 - .../example/lib/stories.dart | 23 +- .../example/lib/story_app.dart | 2 +- .../component_library/example/pubspec.lock | 327 ------- .../component_library/example/pubspec.yaml | 1 + .../lib/component_library.dart | 1 - .../lib/src/count_indicator_icon_button.dart | 50 +- .../lib/src/exception_indicator.dart | 13 +- .../lib/src/expanded_elevated_button.dart | 1 + .../lib/src/favorite_icon_button.dart | 57 +- .../l10n/component_library_localizations.dart | 45 +- .../component_library_localizations_en.dart | 12 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../lib/src/loading_indicator.dart | 25 - .../lib/src/mixins/animation_mixin.dart | 33 - .../component_library/lib/src/quote_card.dart | 12 +- .../lib/src/rounded_choice_chip.dart | 56 +- .../component_library/lib/src/search_bar.dart | 1 - .../lib/src/theme/wonder_theme_data.dart | 61 -- .../packages/component_library/pubspec.lock | 502 ----------- .../packages/component_library/pubspec.yaml | 3 +- .../favorite_icon_button_widget_test.dart | 46 + .../component_library/test/widget_test.dart | 15 - .../.dart_tool/package_config.json | 308 ------- .../.dart_tool/package_config_subset | 201 ----- .../packages/domain_models/.dart_tool/version | 1 - .../starter/packages/domain_models/.packages | 56 -- .../packages/domain_models/pubspec.lock | 348 -------- .../fav_qs_api/.dart_tool/package_config.json | 440 ---------- .../.dart_tool/package_config_subset | 289 ------ .../packages/fav_qs_api/.dart_tool/version | 1 - .../starter/packages/fav_qs_api/.packages | 78 -- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../starter/packages/fav_qs_api/pubspec.lock | 502 ----------- .../starter/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../.dart_tool/package_config.json | 614 ------------- .../.dart_tool/package_config_subset | 405 --------- .../forgot_my_password/.dart_tool/version | 1 - .../forgot_my_password/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/forgot_my_password/.packages | 107 --- .../lib/src/forgot_my_password_cubit.dart | 16 +- .../lib/src/forgot_my_password_dialog.dart | 11 +- .../lib/src/forgot_my_password_state.dart | 19 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.lock | 698 --------------- .../features/forgot_my_password/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 608 ------------- .../.dart_tool/package_config_subset | 401 --------- .../features/profile_menu/.dart_tool/version | 1 - .../features/profile_menu/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../packages/features/profile_menu/.packages | 106 --- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_en.arb | 4 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 28 +- .../l10n/profile_menu_localizations_en.dart | 6 + .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 39 +- .../features/profile_menu/pubspec.lock | 691 --------------- .../features/profile_menu/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 668 -------------- .../.dart_tool/package_config_subset | 441 ---------- .../features/quote_details/.dart_tool/version | 1 - .../features/quote_details/.flutter-plugins | 13 - .../.flutter-plugins-dependencies | 1 - .../packages/features/quote_details/.packages | 116 --- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_cubit.dart | 26 +- .../lib/src/quote_details_screen.dart | 160 ++-- .../lib/src/quote_details_state.dart | 15 +- .../features/quote_details/pubspec.lock | 759 ---------------- .../features/quote_details/pubspec.yaml | 4 +- .../quote_list/.dart_tool/package_config.json | 626 ------------- .../.dart_tool/package_config_subset | 413 --------- .../features/quote_list/.dart_tool/version | 1 - .../features/quote_list/.flutter-plugins | 6 - .../quote_list/.flutter-plugins-dependencies | 1 - .../packages/features/quote_list/.packages | 109 --- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 546 +++++++----- .../quote_list/lib/src/quote_list_event.dart | 44 +- .../quote_list/lib/src/quote_list_screen.dart | 81 +- .../quote_list/lib/src/quote_list_state.dart | 160 ++-- ...r_grid.dart => quote_paged_grid_view.dart} | 20 +- .../lib/src/quote_paged_list_view.dart | 77 ++ .../packages/features/quote_list/pubspec.lock | 714 --------------- .../packages/features/quote_list/pubspec.yaml | 12 +- .../sign_in/.dart_tool/package_config.json | 614 ------------- .../sign_in/.dart_tool/package_config_subset | 405 --------- .../features/sign_in/.dart_tool/version | 1 - .../features/sign_in/.flutter-plugins | 6 - .../sign_in/.flutter-plugins-dependencies | 1 - .../packages/features/sign_in/.packages | 107 --- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../sign_in/lib/src/sign_in_cubit.dart | 117 +-- .../sign_in/lib/src/sign_in_screen.dart | 139 +-- .../sign_in/lib/src/sign_in_state.dart | 36 +- .../packages/features/sign_in/pubspec.lock | 698 --------------- .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/.dart_tool/package_config.json | 614 ------------- .../sign_up/.dart_tool/package_config_subset | 405 --------- .../features/sign_up/.dart_tool/version | 1 - .../features/sign_up/.flutter-plugins | 6 - .../sign_up/.flutter-plugins-dependencies | 1 - .../packages/features/sign_up/.packages | 107 --- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../sign_up/lib/src/sign_up_cubit.dart | 134 ++- .../sign_up/lib/src/sign_up_screen.dart | 184 ++-- .../sign_up/lib/src/sign_up_state.dart | 38 +- .../packages/features/sign_up/pubspec.lock | 698 --------------- .../packages/features/sign_up/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 614 ------------- .../.dart_tool/package_config_subset | 405 --------- .../update_profile/.dart_tool/version | 1 - .../features/update_profile/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/update_profile/.packages | 107 --- .../lib/src/l10n/messages_en.arb | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../lib/src/update_profile_cubit.dart | 62 +- .../lib/src/update_profile_screen.dart | 119 +-- .../lib/src/update_profile_state.dart | 40 +- .../features/update_profile/pubspec.lock | 698 --------------- .../features/update_profile/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 314 ------- .../.dart_tool/package_config_subset | 205 ----- .../packages/form_fields/.dart_tool/version | 1 - .../starter/packages/form_fields/.packages | 57 -- .../packages/form_fields/lib/form_fields.dart | 3 +- .../packages/form_fields/lib/src/email.dart | 38 +- .../lib/src/optional_password.dart | 20 +- .../src/optional_password_confirmation.dart | 38 +- .../form_fields/lib/src/password.dart | 30 +- .../lib/src/password_confirmation.dart | 34 +- .../form_fields/lib/src/username.dart | 37 +- .../starter/packages/form_fields/pubspec.lock | 355 -------- .../starter/packages/form_fields/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 530 ----------- .../.dart_tool/package_config_subset | 349 -------- .../key_value_storage/.dart_tool/version | 1 - .../key_value_storage/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../packages/key_value_storage/.packages | 93 -- .../lib/key_value_storage.dart | 2 +- .../lib/src/key_value_storage.dart | 15 +- .../lib/src/models/models.dart | 3 +- .../lib/src/models/user_cm.dart | 16 - .../lib/src/models/user_cm.g.dart | 44 - .../packages/key_value_storage/pubspec.lock | 604 ------------- .../key_value_storage/test/common_test.dart | 2 +- .../monitoring/.dart_tool/package_config.json | 404 --------- .../.dart_tool/package_config_subset | 265 ------ .../packages/monitoring/.dart_tool/version | 1 - .../packages/monitoring/.flutter-plugins | 5 - .../monitoring/.flutter-plugins-dependencies | 1 - .../starter/packages/monitoring/.packages | 72 -- .../packages/monitoring/lib/monitoring.dart | 9 +- .../monitoring/lib/src/analytics_service.dart | 27 + .../lib/src/dynamic_link_service.dart | 60 ++ .../lib/src/error_reporting_service.dart | 27 + .../packages/monitoring/lib/src/logger.dart | 7 - .../lib/src/remote_value_service.dart | 24 + .../starter/packages/monitoring/pubspec.lock | 455 ---------- .../starter/packages/monitoring/pubspec.yaml | 8 +- .../packages/monitoring/test/common_test.dart | 15 - .../.dart_tool/package_config.json | 452 ---------- .../.dart_tool/package_config_subset | 297 ------- .../quote_repository/.dart_tool/version | 1 - .../quote_repository/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../packages/quote_repository/.packages | 80 -- .../packages/quote_repository/pubspec.lock | 513 ----------- .../.dart_tool/package_config.json | 464 ---------- .../.dart_tool/package_config_subset | 305 ------- .../user_repository/.dart_tool/version | 1 - .../packages/user_repository/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../packages/user_repository/.packages | 82 -- .../lib/src/mappers/cache_to_domain.dart | 9 - .../lib/src/mappers/mappers.dart | 2 +- .../lib/src/mappers/remote_to_cache.dart | 11 - .../lib/src/mappers/remote_to_domain.dart | 11 + .../lib/src/user_local_storage.dart | 15 - .../lib/src/user_repository.dart | 98 +-- .../lib/src/user_secure_storage.dart | 50 +- .../packages/user_repository/pubspec.lock | 527 ----------- .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../starter/propagate-config-files.sh | 199 +++++ .../projects/starter/pubspec.lock | 346 ++++---- .../projects/starter/pubspec.yaml | 47 +- .../projects/starter/test/example_test.dart | 17 + .../projects/starter/test/widget_test.dart | 15 - 339 files changed, 3532 insertions(+), 29234 deletions(-) delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.flutter-plugins-dependencies create mode 100644 11-create-your-own-widget-catalog/projects/starter/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_Packages.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_SDK.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Flutter_Plugins.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.keep delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/.vscode/launch.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/README.md delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/compiler.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/gradle.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/jarRepositories.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/assets/animations/loader.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/assets/animations/on_off_switch.riv delete mode 100644 11-create-your-own-widget-catalog/projects/starter/assets/logos/logo-dev.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/assets/logos/logo.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/coverage/lcov.info delete mode 100644 11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-dev.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-prod.yaml create mode 100644 11-create-your-own-widget-catalog/projects/starter/integration_test/app_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Podfile.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/Contents.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json create mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/Runner/Runner.entitlements delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/config/dev/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/config/dev/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/config/prod/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/starter/ios/config/prod/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/dynamic_link.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/generated_plugin_registrant.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/routes.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/lib/routing_table.dart rename 11-create-your-own-widget-catalog/projects/starter/lib/{home_screen.dart => tab_container_screen.dart} (92%) delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/loading_indicator.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/mixins/animation_mixin.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/domain_models/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/l10n.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (83%) create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.g.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.packages create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/analytics_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/error_reporting_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/logger.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/remote_value_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/test/common_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_cache.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_domain.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/propagate-config-files.sh create mode 100644 11-create-your-own-widget-catalog/projects/starter/test/example_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/starter/test/widget_test.dart diff --git a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config.json deleted file mode 100644 index 9af9139a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../packages/component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cupertino_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../packages/domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../packages/fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_dynamic_links", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_launcher_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../packages/features/forgot_my_password", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "form_fields", - "rootUri": "../packages/form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../packages/key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../packages/monitoring", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_info", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../packages/features/profile_menu", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../packages/features/quote_details", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_list", - "rootUri": "../packages/features/quote_list", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_repository", - "rootUri": "../packages/quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.32", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "routemaster", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../packages/features/sign_in", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sign_up", - "rootUri": "../packages/features/sign_up", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../packages/features/update_profile", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../packages/user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "wonder_words", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:36.050998Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config_subset deleted file mode 100644 index 816cea73..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/package_config_subset +++ /dev/null @@ -1,453 +0,0 @@ -wonder_words -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_launcher_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.2.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.32/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.32/lib/ -routemaster -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins deleted file mode 100644 index da75d698..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins +++ /dev/null @@ -1,20 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -firebase_dynamic_links=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -package_info=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ diff --git a/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins-dependencies deleted file mode 100644 index 5e05a0d6..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/","dependencies":[]}],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]},{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_dynamic_links","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","dependencies":[]},{"name":"package_info","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:37.175716","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.gitignore b/11-create-your-own-widget-catalog/projects/starter/.gitignore new file mode 100644 index 00000000..a801afa8 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/.gitignore @@ -0,0 +1,126 @@ +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/* + +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* + +# Flutter repo-specific +/bin/cache/ +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/docs/doc/ +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds +.fvm/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +**/android/.idea/ +*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/.last_build_id +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Coverage +coverage/ + +# Submodules +!pubspec.lock +packages/**/pubspec.lock + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to the above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/launch.json +!.idea/codeStyles/ +!.idea/dictionaries/ +!.idea/runConfigurations/ diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/.gitignore b/11-create-your-own-widget-catalog/projects/starter/.idea/.gitignore deleted file mode 100644 index 4b922951..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/shelf/ diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_Packages.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_Packages.xml deleted file mode 100644 index 65ec8272..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_Packages.xml +++ /dev/null @@ -1,824 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_SDK.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_SDK.xml deleted file mode 100644 index d5634f1a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Dart_SDK.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Flutter_Plugins.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Flutter_Plugins.xml deleted file mode 100644 index b0f69711..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/libraries/Flutter_Plugins.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/misc.xml deleted file mode 100644 index f8c5fc91..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/modules.xml deleted file mode 100644 index 7cf2c516..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/starter/.idea/workspace.xml deleted file mode 100644 index 0a8d1ab4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.idea/workspace.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1636555907583 - - - 1636557147467 - - - 1636557215865 - - - 1636704824613 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.keep b/11-create-your-own-widget-catalog/projects/starter/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/starter/.packages b/11-create-your-own-widget-catalog/projects/starter/.packages deleted file mode 100644 index 90e967d1..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.packages +++ /dev/null @@ -1,119 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:36.021505. -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:packages/component_library/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:packages/domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:packages/fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_launcher_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -forgot_my_password:packages/features/forgot_my_password/lib/ -form_fields:packages/form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:packages/key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.2.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -monitoring:packages/monitoring/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -profile_menu:packages/features/profile_menu/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -quote_details:packages/features/quote_details/lib/ -quote_list:packages/features/quote_list/lib/ -quote_repository:packages/quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.32/lib/ -routemaster:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sign_in:packages/features/sign_in/lib/ -sign_up:packages/features/sign_up/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -update_profile:packages/features/update_profile/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -user_repository:packages/user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -wonder_words:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/.vscode/launch.json b/11-create-your-own-widget-catalog/projects/starter/.vscode/launch.json deleted file mode 100644 index 6bed9c18..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/.vscode/launch.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "wonder_words (dev)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "dev", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (prod)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "prod", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (profile mode)", - "request": "launch", - "type": "dart", - "flutterMode": "profile" - }, - { - "name": "fav_qs_api", - "cwd": "packages/fav_qs_api", - "request": "launch", - "type": "dart" - }, - { - "name": "quote_repository", - "cwd": "packages/quote_repository", - "request": "launch", - "type": "dart" - }, - { - "name": "user_repository", - "cwd": "packages/user_repository", - "request": "launch", - "type": "dart" - } - ] -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/README.md b/11-create-your-own-widget-catalog/projects/starter/README.md deleted file mode 100644 index 3be5e496..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# wonder_words - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/.gitignore b/11-create-your-own-widget-catalog/projects/starter/android/.idea/.gitignore deleted file mode 100644 index 4b922951..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/shelf/ diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/compiler.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/compiler.xml deleted file mode 100644 index fb7f4a8a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/gradle.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/gradle.xml deleted file mode 100644 index 164e4e99..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/gradle.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/jarRepositories.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/jarRepositories.xml deleted file mode 100644 index 7a35ca4c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/jarRepositories.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/misc.xml deleted file mode 100644 index 6199cc2a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/modules.xml deleted file mode 100644 index 09b8b0ca..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/modules.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/starter/android/.idea/workspace.xml deleted file mode 100644 index 4cf51c19..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/.idea/workspace.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1635811920603 - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/build.gradle b/11-create-your-own-widget-catalog/projects/starter/android/app/build.gradle index 9f73c425..7d93d0b6 100644 --- a/11-create-your-own-widget-catalog/projects/starter/android/app/build.gradle +++ b/11-create-your-own-widget-catalog/projects/starter/android/app/build.gradle @@ -24,31 +24,17 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' +apply plugin: 'com.google.firebase.crashlytics' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - - flavorDimensions "flavor-type" - - productFlavors { - dev { - dimension "flavor-type" - applicationIdSuffix ".dev" - versionNameSuffix "-dev" - } - prod { - dimension "flavor-type" - } - } - - compileSdkVersion 30 + compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.raywenderlich.wonder_words" minSdkVersion 21 targetSdkVersion 30 diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/google-services.json b/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/google-services.json deleted file mode 100644 index 9cd7d360..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/google-services.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "project_info": { - "project_number": "67633443658", - "firebase_url": "https://wonder-words-dev-default-rtdb.firebaseio.com", - "project_id": "wonder-words-dev", - "storage_bucket": "wonder-words-dev.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:67633443658:android:a76ea13116df0119a8c7b3", - "android_client_info": { - "package_name": "com.raywenderlich.wonder_words.dev" - } - }, - "oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBJZHdBdsSfW8Sjqt4-ShjBj0_4wZVrQBA" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.raywenderlich.wonderWordsDev" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 7953212c6e49fb52569d83b90c2f7e2c16a0e428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3432 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 y>%SWBE%dLBHW>W`7>s@b3`Rcz2BV(Xsb< diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 2482b9d7804a578b39be249cbd522783e378dc37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6570 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 AQ2+n{ diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/google-services.json b/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/google-services.json deleted file mode 100644 index edce3685..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/google-services.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "project_info": { - "project_number": "581028325132", - "project_id": "wonder-words-prod", - "storage_bucket": "wonder-words-prod.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:581028325132:android:d1b724c0e1edfcc811cb29", - "android_client_info": { - "package_name": "com.raywenderlich.wonder_words" - } - }, - "oauth_client": [ - { - "client_id": "581028325132-vubnrst78erk429gp4pifvhgdbougu9l.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCOZw3tWZSXBSyZ8e7lz5xCWsu-s4wiyRc" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "581028325132-vubnrst78erk429gp4pifvhgdbougu9l.apps.googleusercontent.com", - "client_type": 3 - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 03205927c66d55c5c2d29d1a99f078242f078e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 zcmV+}3eok6P)Dl<0a4oszz*A;C^m~{{Bv=eM_Wk)t5|1FC_}45!dLT*jyIAP}M%XlZwuv-TQLJ!u%^w{=rTF{_zQX(jw zI|L)s!?xeEueAw&+5ZWKJ--GLfu82y!N|-qj16OY)p-)+vR#5mwMJ&;fH#dH$IFn+ z+IT}mi_Z-Yt@skj*`hhy0d4-|P9M%XBNez)gl9N$nI)m=@ zIXHaoV+-!UM_+3jl5-gM)+*;Hch%-8PV99CO%r6zY)4+QH`7Il`vQ!|cfpaN_e4)- z7eW{eJhXydz<_ejgKxas#|FTpW~v=BO^~y0>B&lNJW*tP^AJn@2_@$(`;BtnHuPAJ z6`ku8)C`44l0%jx?zoRnP(4Ut=PxF-Dn&@6&DjYD&+fCGoN!QpW$k-GYb1P5H8l*< zFK&e(?y!bOQ0?+VHs^n{rQ}?NbK}2-e+(aKNLqD$*LM87yyzTFK9mk!)N~G4Agouh zOhHbi$~c3>Y=_fhLp5H}9K0wDeQi${og<^{*AbGs2&$DK5?hx;^%C*)iH4Cw*wDKf zNxEM-rU`_IPrq&z2|>P!)ha<`_*y(_lpgf{29~zH02d~8gF#Et5pcuW$eW;*h#nuG z2)A;c>rQ#me0^@d!^@&{CPd9RSlfmKeOg`HfCsj$+6^IL5RLi)IR4)~Fp;QkJaAv% z6ZrRb<(OVnz@RHCaa_Y_y^$u+gd>p@m857{`wkTQPb(Ve7M}|S*L;rd`El_$9K0RL zYJx9L{juVhsV5YIp5{Huvy;iWNic5XRs@ZkMleoy)B}ojrZRHGz7YnN+*2{E*xdh; zLJoriCFunixcLa2xcIGM+f6HW0j)xj(dp9?pbu5WxYOVEjDy50I2cJ|Np`)}ov)&? z-U_j_e*I0$A3)XKE$-8Ehw#y6vaId;?!7P+y&F|c|4k1pS%pMCuN(_b=D8|CRj~xG ziajbOgC+;b7E#Vwa6ba~E!~bG#(}bW_x9e41pXChmX%)3EdjJ0q$9I3Nq4}*{rlkX z&@(WdEY{O-(2J2eg%s*43sS9W(lxRKjmJ$(kTtQGQ;K~qh%d;A-t1j8*vH^pbV{kS zv3Cu2@N3*_7hg+nKsBs1xSPGk##XKVr(o-?$D=J+KjPN3CK;` zAnQP#B}tkR1J-Vgk#-|NJH_896|t_HB&S_GrdUbqbzG8~UY6Efg@l(-osOa{W6AwB zkzSObT}pkDzMFj2%fFab7Au={^Hw7wu$faDJkqMQbzL8#3%`hl^)LAADzOgDu6B6K z+mfq}rsUAYjfC#UA;SPf6LAbFUIuL>P6I-tB|D{%qxv}~h`b5eg;7xwyy%r)$C!=S zV5&iZ8eAu3LpzYh*#zMT4_&2^x(_(N%n|V zs#Q`?LljuvyoQ{#Jt}4emGzrP(7anKXbV(=XwIIvDEl;tM^J82$dF19g*`;lWN8(B zg5v2ccxxQ1Tu)F5qG33Vg{mYdk;y}=MXq!{L#riTw{C~|Hb@>LG-|E%Tp+JuC>#jD zg)#wJp@PAY1pYvA@j-XGg-1|&QP?0Yq6t$3U3Xt6*Nt>m_xp7o zK`Bvs$jaOK&DdN+?Hct~S19-@CO2EiPzj=mwrhG-^a&b|&q8Ogc$~1XLF#2ng4kLf z{cqqG4pa%Esb5{s%_E3S<}Z$zo-m1C%)~e-lbc}M1;S84>N|Bu{AW}kD7$yv^~ zK0JbkC;tsUx9os$@Gb}m5xg>G{b}xqawY+(9TlR@RkH7Z;&sPv;8R79o+~+)#Wt(i z7NmM|eJbQ>XQh&n>dC*!RAiu>mW*_rB#h2b+fg_<@*(H>xap1p9Q}#b+*J211*I!B zvIND17|qM5GgIZqY#U4Exr?qE0Bh#OST1)#y1eUa;&2XdgP;nyK~M$!AEDgn=+UC3 QxBvhE07*qoM6N<$f(6gmV*mgE diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index bb3c5bbfb374a4216810949d95497d1323f7c17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 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 RKb-&o002ovPDHLkV1j6qon`<4 diff --git a/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/starter/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index f0a687ad7334f44ca7f7905874a4f18292e10de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7091 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 z 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 S2=71R0Llt#^5wE70sjY7kFd!A diff --git a/11-create-your-own-widget-catalog/projects/starter/android/build.gradle b/11-create-your-own-widget-catalog/projects/starter/android/build.gradle index c5a41754..a4793051 100644 --- a/11-create-your-own-widget-catalog/projects/starter/android/build.gradle +++ b/11-create-your-own-widget-catalog/projects/starter/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.10' repositories { google() jcenter() @@ -9,6 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } diff --git a/11-create-your-own-widget-catalog/projects/starter/assets/animations/loader.json b/11-create-your-own-widget-catalog/projects/starter/assets/animations/loader.json deleted file mode 100644 index 7d4c61b4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/assets/animations/loader.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIoAAACKCAYAAAB1h9JkAAAQPUlEQVR4Xu2da2wcVxXH/2ccO0lpHi0tRapKHQGiAiV2igq0ATKuVKRAaOw+7SQoST8164o6H/hSEHFopfKF1lFrN1+qJGpcG1IUpy8UQM0YqFQh1DgJICoh6iBUqUgIhzbxru2dg+7srtdeez1z7zzu3fWMFCny3rnP35x7zrnn3kuoscfufLSZiG5ll1pBWA+QXW4CN4OouaJJE2CMzf6NMAbmCSJ2mOiy8/JA+bca64skq0tJFqZSVlvX/q0eFBbsIhTrVfJZ8h2GA7Aj4Dk79MJo5PnXQYbGgWK396zH6ukdALcD1K6ljwU4zCPINR13RvomtNTBsEKNAaXt4e4dTNwO8uCIXmoodzyPADSCycbTyxkaraB40mPl1B4QehbRLZSHNqYXhWQ5Bs4fdoaPjMdUhrHZagHFA2TV1OMg6jFLegQcJ+ZjgHtoOQGTKChzAOkNOCRmJ/OU4Py+5QBMYqDYXfvbwfRsDUwx8nAy9yLbdLiedZjYQbF3ZlrhCkCEeVvHD/M4iA84Qy+M1GMrYwXFfjjzOCzqq8eOq94mHsFk0756ky6xgFLwhUwd1eYH0U2mkC6w9jnDzzu6qxJV+ZGDUphqcEq7LsJ8GUTrouoopXyYe53hgUNK7xr2UqSg2J2ZvSA6Gn8bWbjZx8CYACwHljvht2ZTsLhmWgFXrAWJf60A7Phhqo+pKDJQYtVHGOcB4SG1nKjFuScBmWwwC2h2xAM5j2Gyqa2W9ZZIQLE7M0dBtDfiTr7kwcFuX1J+iqKfpx2EvQBtjbY9PAbCPj/JF22Z0eUWGpToIeFRsNUbteSQ7TIRzgA09IKwR/bdJdJPgLitFmEJBUqkkDCfBqw+3YBUDrIHDFk9YAj9KwrluCZhUQYlMkg8/YN6TANkUWBg9UWjx9SezqIESiTWTcF87XWG+mvKIWd3PmaDxKIgbg03JdUWLNKgRAIJhB7i7k1KSQ03oAvfLii9032h9ReG4wz3t0VdvzjykwKlaEqeC1UR5kPO8EBdrB57Hw0gpiN13aVG+iMwKEXT8Zyyx1VMNbDaTddFZD+C4qLnMRBaZN+dTc/UZnq/BAelK3NKee1GQGLBrkWzMMjgF6ciJwQsE5hs3GCyQy4QKKH0EmHVZBttkzshCAx+acLDwiPO0ECHXzm6fvcFpeBHaBB6iXzA8zKBpDR4xVVzEYyt5tVl3ucMDwiLyrjHHxTVKUdMN9mm5nqXJAv8LQWLSHUaMnYKWhKUos/grDTeda6T+PVHuGmIDztDAyLo3KjHB5TM+0pWDvHmelVcg45eMS7HUTKdOb/BNB9TVVDszkwviA4G7Zg56Q7UmrdVoY2BXvECymGdCpR4biIDHXGLglLc1vm+tALLfNoZHtCzDVR6NJJ5we7K9AH0uHRphvlWFgdFTZpcwmRj63JTXoMAYHd2i1gUOYecYR/d4qB0df9XWprA7ZDZqsDMwtwWX1ppG4fY5nCciOpuU7jy0odBusoCUNScazzqDA0E3rfDzCJeVVhTlb4Zsae3g4jq7swSu7NbuPnlgqAYx53h/qgjB4MIwQVpFgNF3tKRIL8oSYQDr/LAm1LlBCRt9SZZimtl49JW0GTjdSZM5/NAUfKbSFLPzOIL8YvUF1Kl7nbcKVqSRliRFaCoiEc5m5/FPl3Az+w+RER1EYowV4arSRUec4YGNivNFxG+NB8UWSVWUpqIegcE5QBRfW5FVZIqElN7hGzMy2oWFCXnkEIDioqsX/DT5npUaEXPF31UwqqUebRPP2VQOjMjUoHDIex8ZhZxstWcUIeJqIeZhUdTOO+EJSSmIiNXVWVGu5RW3gLSP/3MkSiSvpOQS+JVpiBPN2EWB/1hrut7nIg2qAyKie8oSW/N1o8HipJDKIKKF01l4VMRz1jJJF7EMrpMRPLxMCZSUqyT3ZmZkDOV5RyaUTe9AEpXt1jWfjZw5iGmnSBlFAGaO48Lj60Rjqcg9Q+SRmH60Rp+UABFXj+JPRKrCIuYgoSkqUNPrbc/SCLWR6+eUpIocms7CtZOkK9sOaVRsX6coX7fiMS4+pAUKnzJGeqv5n6Pq551ma/0qrLG0AOSdtsrONnqcpQjaJR8rIo+hZYUFNm62ekXwViHykJ6pV7jrkKSdilrFH+hRsXAl2tJmpPdlXGk9qGkimxkyMnrh3JxP5FVFOICHElQdGreUTbclLzsrm4OXpcUlOB9VWcppT5U5nFneEDLUobQUSQi2vQRXWd8zDZHChQAuiS6sHpqQvSloBR6IAWlXknwaVcqUZbpwMs2OwVFtseWafraAUUqLiJVZqPmuXZAkfOjTDhD/ddF3VnLOT+7K3MOoFLwll9XaFuQTR1ufkMT8++1YnVKg4LUhR8ZOrXmwpc7liFdFIwOlMIp2DJRbtrCIeVXjwHte0wiGynNGdVYmEHtUK15XCMvXjpwSaM0J/mtGnqDfCMfLY0ZSlo8gMaz8UrB1RLrPQAi2NOjcXyMKFpekdW3ziM6rAiKZPCS5OlKRoyMYZWQ3y2o19lZ2tcjdwJkGmAdGjvpDWAa42XLEkXaTEPqoQ2Jii19xIjeGzjmblKX01PS6UcZFflpR69+MitRxH8UtpWmZ8oqoiI97UCvflIJivwt6Kk7XxqV4m0l4rDn4E/II0aCF1Q9ZXnqEbdCrJ6WOwkoVWqlx0B6H5UowQB3RNjD/oy9NkR6BBN4Qeno+JiPGAna7IrD/hQO+ddstgVtqAnplKSJAdPOPB2l1JF2V7c4M03uTt9UV/HlUOkmNYMux1p4crXs6Uuiiwy8NsR35BJOYKvcpGaQtF4IinfV2ZT8UdwaVzYTHnPp4qQ3o3sfn1lX7UV3DQvzOLJNm004t116JGN8Qfm+aMMsyqUudpIzlb3ONvtK1hh5qJq13Zk5CpWDCg3T+9Kr4mKkRzqCrVQXw6TJolbPrPVTcMCJ0xjlLCAv1/TyyWJA2GJ3Ei2NpmG6SamyS99Sqnp5IjAB4rblelOpkmOtjI+RMcm+x1HK7mSb87ksS1iKt6mfldjUVe4yxnlnuD/oZrAYJ82FWfuD0vloM2CNyR3HPTvZjmGyqW25WEKhIPFsAb0xJ0uR5wuKeFlZKSv4A8ZhoaPep6HwkLDRp20GAqUIi9w1LfPxrOtpqKC4iuvvAu8hrvh49ceb+M1jwUEJYwUVajEBuPtkrrz1q7wJvytbN7OzM18G3FZn+IhYY6v68Ns7b6UtL1/S1ebAoHhSxftyyO/2Lr+29DlD/Qf8EtXC73Zn5iBC3n2Yncy+9s7Ii/cu1d6Z0fuem7k61d24ZmWm4eu/PKKjb6RACa2vzLaQx8Buh99XpKNDgpRZcMtPnwLNXu4d5LUFaXLZHKZyU+Kexb53f/XSoh+PB8mV3GPFnTVoXLtyvw5YpEGJDhZMwOVe5+cDh5V6WdNLdle3uORaXHUX6qKp6dw0stls+dNZBJZKSEqJdcCiBIoHS1dG7hSE6rPvGNg64Aw/72ga+0DFFlaA3WfVFdZyMZWQlNWVsmSZeqv9RTc7/UhJklRWMmlYlEEpSBaFe5KrAzMCtg6bBowHCNw9Sgt7i7R1Znoak1fLkqQyiZiG3vnBR2vd7MwjfgQnCUsoUKKHpRAEBdAh3cAUAOGDYfWQuYMtIMlezYFRfQvVk9+ZxN0bJv0Ymf09KVhCg1LUWeS2pAbpBuGoIxoB8fGknHVFq24PxC2pRJFeXlVtupnbFU9tv4q25urSplq3Na5b9f2GLa88F6RbVdNEAkqECm6VdvAYQA65cDjXOBrVkoCwXmjl9Fa2YMcBR6kxJetmqUH66Y4r+MYtObVxJGDF2lWPrNjyylG1DPzfigyUWViERUC0zr/oMCmEeQ0RAjFOTGOw3ImzQy+MLpVjW9f+rXCt9UwsFt2aQWiNQjH1a0X2ahbT09NLJnum42N89eYpv6yq/m6tbkTj9Z8ALLTRxhOxGAWRguLBIpxyLh0DoUW55XXwIjP+OXn1ygf5Gfdr1ZpDBPysPSJISoXEBEvkoHiwFBxSfSAIn8Pye5hPI9u091+59ybX0Q2vAXRPZScISJ574GNsvikCSVKZeQywxAJKqd7eqnMiU5EhLIroNKDHGR44VqrR57ZtW7kWNw4RoaP0t1ghiUmyxArKspIuQorA7Vl0WcK2V9y++jO/ELA0WMDh+2OSJAsly7do44nfRPEZxQ5KWbp4fgkxHdWX7sI4D1CPr9/Htld85dpbTh556KP2L94wozx2s4pr0BwsRAJLYqDMm44KK67yQdtBOyeZdGLJX6yEi3Uf34ff3LYya634Pbl8h2/iKgmkISlPQ6FhSRyUOgDmEph75+ohfgMvIJmyVvyRXd7kl7ba78qQRASLNlDmA4O9UlfqqvZ2qPd4VEydsoFXfNa+diq35m2tkEQAi3ZQysB4Qdzi1CdhKZkyLXnTCzg/ohI7IyDJ5db8CS5/QZXR0JIkIgXXGFDmtqcYg7oXTHbiyq9QTokdEI6FWWMyEpKyZNlOG0+8IQOvkaDMg8Zz3s20Aq6AxgajNbIlAuH3IIjlAAewHF/LRaJnc2e2P8B5nJR4ZV7SyCXJgorQvdTy0mtB62c8KNUaUowTESu8xVVeagbx4iu+TOMAF4KXSawTNUxECUW1Ok6PdjyVvzL1w2rBR7EprkFH30JgyVKzoATtC93pZGGJX5JU9EhAWFJQEiApKCyJQyKhs6SgJACKKMIPFm2QBIQlBSUhUJaCRTskpT5gvo9aB08t1iUpKAmCUoDlvt78ldzBkoJrDCQ+sKSgJAxKEZYn81dyP7JWNxUi00x7yG2nTS+fnlutFBRNg5T/w/0HrDWrn9FU/NLFMq7Cyn+ZNg39rZQwBUXjSPGFXdvA9KbGKlQvmvF3NOY205dOfuy5n4ys5DKqFF/cfQ9c/NrMJvPT1DL4RAqKIaNjNCwrZ26m24Y/SCWKObDYcCFxq3pCFSf+CW0aPJiCklB/BymGL+42EBZ+h1oG70xBCTKCCabh89+7G+y+DqLVCRa7dFHT1zSloBgzGuWKGCdZVuVvTEExEBRRJaNgaXSbU1AMBcWDZWxnG8gSfpZVmqt5WwqK5hHwK54v7r4Lef6tVp3FndmQguI3Ugb8rh8WuikFxQAQglSBL+z8Jtg6o2UauuY/q1JQgoySIWn0SBb+HbUMbk1BMQSCoNXgc7u2wCIhWRKKT+AD1DLYl4ISdIQMSudJFpfPAHRtrNXytrNYN1PLS1dSUGLt6fgy5z/vugN5vBUvLPwEtQw+na4exzeOieTMF7ruBDeI80/imIYuAHSXkCYpKIkMZ7yFxCJZmD9Ag3s7bRz6sFT7dOqJdxwTyZ3P774dgNhL/OnwBfI/APo2tZx4b25eKSjhe9aIHPjdB29EQ9OrAFU9hdK/onwG1+Ah+vzg/yrTpqD4915NpeCxXeIM/R+DKPjRIcx/BeEgtQy+Uq2xKSg1hUHwyvLF3Q8hz9tA9F0An1zwptBDCK+C8Qa1Dr7ul3MKil8P1cHv/JcHr0d+xafg4gag8d9YM/khffakOOo08PN/2HOJw58nvJkAAAAASUVORK5CYII=","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/assets/animations/on_off_switch.riv b/11-create-your-own-widget-catalog/projects/starter/assets/animations/on_off_switch.riv deleted file mode 100644 index 8ae8b835ac4c5bacf123bb3538582771df90d62a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| diff --git a/11-create-your-own-widget-catalog/projects/starter/assets/logos/logo-dev.png b/11-create-your-own-widget-catalog/projects/starter/assets/logos/logo-dev.png deleted file mode 100644 index 671a752d59878614a0b355ef7505eed09ff8e18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12084 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/coverage/lcov.info b/11-create-your-own-widget-catalog/projects/starter/coverage/lcov.info deleted file mode 100644 index d714c7c1..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/coverage/lcov.info +++ /dev/null @@ -1,208 +0,0 @@ -SF:lib/main.dart -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:36,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:50,1 -DA:52,0 -DA:54,0 -DA:55,0 -DA:84,0 -DA:86,0 -DA:87,0 -DA:88,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:111,0 -DA:115,0 -DA:117,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:122,0 -DA:123,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:142,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -LF:46 -LH:1 -end_of_record -SF:lib/dynamic_link.dart -DA:10,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:20,0 -DA:21,0 -DA:23,0 -DA:27,0 -DA:31,0 -DA:34,0 -DA:35,0 -LF:12 -LH:0 -end_of_record -SF:lib/home_screen.dart -DA:7,1 -DA:9,0 -DA:11,0 -DA:13,0 -DA:14,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:27,0 -DA:28,0 -LF:14 -LH:1 -end_of_record -SF:lib/l10n/app_localizations.dart -DA:63,0 -DA:67,0 -DA:68,0 -DA:109,1 -DA:111,0 -DA:113,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:123,0 -DA:128,0 -DA:129,0 -DA:133,0 -LF:13 -LH:1 -end_of_record -SF:lib/l10n/app_localizations_en.dart -DA:8,0 -DA:10,0 -DA:13,0 -LF:3 -LH:0 -end_of_record -SF:lib/routes.dart -DA:18,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:31,0 -DA:32,0 -DA:34,0 -DA:37,0 -DA:38,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:46,0 -DA:51,0 -DA:52,0 -DA:54,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:70,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:79,0 -DA:80,0 -DA:82,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:97,0 -DA:101,0 -DA:104,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:110,0 -DA:111,0 -DA:113,0 -DA:114,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:120,0 -DA:122,0 -DA:123,0 -DA:131,0 -DA:133,0 -DA:135,0 -DA:136,0 -DA:137,0 -DA:146,0 -DA:148,0 -DA:150,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -DA:160,0 -DA:162,0 -DA:165,0 -LF:73 -LH:0 -end_of_record -SF:lib/screen_view_observer.dart -DA:8,0 -DA:11,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:27,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:45,0 -DA:47,0 -DA:50,0 -LF:19 -LH:0 -end_of_record diff --git a/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-dev.yaml b/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-dev.yaml deleted file mode 100644 index 3e0eb9e0..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-dev.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo-dev.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-prod.yaml b/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-prod.yaml deleted file mode 100644 index ee32842d..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/flutter_launcher_icons-prod.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/integration_test/app_test.dart b/11-create-your-own-widget-catalog/projects/starter/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Flutter/AppFrameworkInfo.plist b/11-create-your-own-widget-catalog/projects/starter/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Flutter/AppFrameworkInfo.plist +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Podfile b/11-create-your-own-widget-catalog/projects/starter/ios/Podfile index 9411102b..85198f16 100644 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Podfile +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '10.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Podfile.lock b/11-create-your-own-widget-catalog/projects/starter/ios/Podfile.lock deleted file mode 100644 index 1294231a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Podfile.lock +++ /dev/null @@ -1,180 +0,0 @@ -PODS: - - Firebase/Analytics (8.5.0): - - Firebase/Core - - Firebase/Core (8.5.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.5.0) - - Firebase/CoreOnly (8.5.0): - - FirebaseCore (= 8.5.0) - - Firebase/DynamicLinks (8.5.0): - - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 8.5.0) - - firebase_analytics (8.3.0): - - Firebase/Analytics (= 8.5.0) - - firebase_core - - Flutter - - firebase_core (1.5.0): - - Firebase/CoreOnly (= 8.5.0) - - Flutter - - firebase_dynamic_links (2.0.8): - - Firebase/DynamicLinks (= 8.5.0) - - firebase_core - - Flutter - - FirebaseAnalytics (8.5.0): - - FirebaseAnalytics/AdIdSupport (= 8.5.0) - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseCore (8.5.0): - - FirebaseCoreDiagnostics (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - FirebaseCoreDiagnostics (8.6.0): - - GoogleDataTransport (~> 9.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - nanopb (~> 2.30908.0) - - FirebaseDynamicLinks (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (8.6.0): - - FirebaseCore (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/UserDefaults (~> 7.4) - - PromisesObjC (< 3.0, >= 1.2) - - Flutter (1.0.0) - - flutter_secure_storage (3.3.1): - - Flutter - - GoogleAppMeasurement (8.5.0): - - GoogleAppMeasurement/AdIdSupport (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.5.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.1.0): - - GoogleUtilities/Environment (~> 7.2) - - nanopb (~> 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.5.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/Network (7.5.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.5.0)" - - GoogleUtilities/Reachability (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.5.0): - - GoogleUtilities/Logger - - nanopb (2.30908.0): - - nanopb/decode (= 2.30908.0) - - nanopb/encode (= 2.30908.0) - - nanopb/decode (2.30908.0) - - nanopb/encode (2.30908.0) - - package_info (0.0.1): - - Flutter - - path_provider (0.0.1): - - Flutter - - PromisesObjC (2.0.0) - - share_plus (0.0.1): - - Flutter - - url_launcher (0.0.1): - - Flutter - -DEPENDENCIES: - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) - - Flutter (from `Flutter`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseDynamicLinks - - FirebaseInstallations - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_dynamic_links: - :path: ".symlinks/plugins/firebase_dynamic_links/ios" - Flutter: - :path: Flutter - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - -SPEC CHECKSUMS: - Firebase: ff8c73105b90e33e1dc6c8e5445d7adc2ccdc7c1 - firebase_analytics: 3b7d92b8d1a3482f557c201e5e46c2f7fa2644ff - firebase_core: 82d486a6231b636aea229bd471bceca82cbe00a6 - firebase_dynamic_links: 0768a32e69be5b6f9af258f8e072537dff6b8969 - FirebaseAnalytics: 96325c1e0acbd2bb805c6a613028b1fe599d6a37 - FirebaseCore: 1c1ca72483b59b17050f5b4cec4fb748425a3901 - FirebaseCoreDiagnostics: 3721920bde3a9a6d5aa093c1d25e9d3e47f694af - FirebaseDynamicLinks: 6e406b3bb669f8c8a63e7254bb63251fa3f88a43 - FirebaseInstallations: 0ede6ffcd215b8f93c19d9b06c1c54e2d4107e98 - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - GoogleAppMeasurement: 8d10c1c470fcb0e5143ed74fddd164f0a0384800 - GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 - GoogleUtilities: eea970f4a389963963bffe8d8fabe43540678b9c - nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - -PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea - -COCOAPODS: 1.10.2 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/project.pbxproj index a859a809..3053d607 100644 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */; }; - BBB11ED626B6BF050025AFC5 /* config in Resources */ = {isa = PBXBuildFile; fileRef = BBB11ED526B6BF050025AFC5 /* config */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -32,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -51,12 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "GoogleService-Info.plist"; path = "config/prod/GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; - BBB11ED526B6BF050025AFC5 /* config */ = {isa = PBXFileReference; lastKnownFileType = folder; path = config; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,12 +85,11 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( - BBB11ED526B6BF050025AFC5 /* config */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -105,7 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */, + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -121,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -149,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, + 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -174,7 +159,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -206,69 +191,66 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BBB11ED626B6BF050025AFC5 /* config in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); - name = "Thin Binary"; + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -276,32 +258,33 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "Copy Firebase config to specific location"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#1\nscheme=\"default\"\n\n#2\nif [[ $CONFIGURATION =~ -([^-]*)$ ]]; then\n#3\nscheme=${BASH_REMATCH[1]}\nfi\n\necho $scheme\n\n#4\nGOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist\nGOOGLESERVICE_INFO_FILE=${PROJECT_DIR}/config/${scheme}/${GOOGLESERVICE_INFO_PLIST}\n\n#5\necho \"Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_FILE}\"\nif [ ! -f $GOOGLESERVICE_INFO_FILE ]\nthen\necho \"No GoogleService-Info.plist found. Please ensure it's in the proper directory.\"\nexit 1\nfi\n\n#6\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\necho \"Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}\"\n\n#7\ncp \"${GOOGLESERVICE_INFO_FILE}\" \"${PLIST_DESTINATION}\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + name = "Run Script"; + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -337,233 +320,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-prod"; - }; - 249021D4217E4FDB00AE95B9 /* Profile-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-prod"; - }; - 97C147031CF9000F007C117D /* Debug-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-prod"; - }; - 97C147041CF9000F007C117D /* Release-prod */ = { - 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 = 10.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-prod"; - }; - 97C147061CF9000F007C117D /* Debug-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - 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-prod"; - }; - 97C147071CF9000F007C117D /* Release-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-prod"; - }; BB141C0626CFD1FC000800DE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -611,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -684,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -759,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -791,248 +547,15 @@ }; name = Profile; }; - BBB6099C26B6B74C00182666 /* Debug-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-dev"; - }; - BBB6099D26B6B74C00182666 /* Debug-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - 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-dev"; - }; - BBB6099E26B6B75700182666 /* Release-dev */ = { - 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 = 10.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-dev"; - }; - BBB6099F26B6B75700182666 /* Release-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-dev"; - }; - BBB609A026B6B75E00182666 /* Profile-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-dev"; - }; - BBB609A126B6B75E00182666 /* Profile-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-dev"; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug-prod */, BB141C0626CFD1FC000800DE /* Debug */, - BBB6099C26B6B74C00182666 /* Debug-dev */, - 97C147041CF9000F007C117D /* Release-prod */, BB141C0826CFD229000800DE /* Release */, - BBB6099E26B6B75700182666 /* Release-dev */, - 249021D3217E4FDB00AE95B9 /* Profile-prod */, BB141C0A26CFD23A000800DE /* Profile */, - BBB609A026B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1040,15 +563,9 @@ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug-prod */, BB141C0726CFD1FC000800DE /* Debug */, - BBB6099D26B6B74C00182666 /* Debug-dev */, - 97C147071CF9000F007C117D /* Release-prod */, BB141C0926CFD229000800DE /* Release */, - BBB6099F26B6B75700182666 /* Release-dev */, - 249021D4217E4FDB00AE95B9 /* Profile-prod */, BB141C0B26CFD23A000800DE /* Profile */, - BBB609A126B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 240137a2..271470a7 100644 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme b/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme deleted file mode 100644 index 577477e2..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png deleted file mode 100644 index 945ed968a64cccb6857eca604815f7fec17b4239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68393 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%0D<}o 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png deleted file mode 100644 index c8b143b232bd394e11ae6232f8a401ea57a7aa3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmV;00($+4P)L(z(8ygZ=sFRxuRAha!(Np2G5XJY7LgCypOQENBN4cv4*0r!EB-`d|`F zq|hIN80Fo<8Yv#+m;M^z@`LPaHdE8Jhq=Wk`L}LN_OW2rZmC!gr&oD}WTEOk65SqLhD8W99g<;;Vl7ap fdT{v{AOEl43bEaG&wF-y00000NkvXXu0mjfZPO)7 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png deleted file mode 100644 index 28e0aeef6e555233fa2cdcacc350b0518e3f51cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmV-#2$1)QP)?o2k(&m=Qc&?0kq8(yF=~uacu~*?AAI8hqcJ4L#0O(y z0tyBb&}d3P6vd(#Q0^3Ii@m!o+soc}c4z(1nc3Z$otb4ivqkXBc5`Ot%$#rj^WV2N zxC3GPuL&4|8fmu!SUcD(Q0h{-8sWengFqA_@yRBq1vzOXx}g!KPSJI%KMDhW=<-3& z7{vL>Ag2X6X-^?x%vyl8lEXw2IQ;NrphTgQeCAb^e|R1-V?sVo0vQ&1S9 zz)3$CdRK{qe4+^$h(IU-jg_K-P7dUx(Z^XR4`Xmzp|$|JLqy~Yt8Nu(pc>2=W=(G| zbwDr-F1s08xuGO&`jNbvf6OZsq$i}%st8eY90{9!jyCcwY4qsh92pFl4m35zP*+A? z{`_Fp6**}PhbBo6MFG7wmmuE53>qq-xi0n0U{ta028S*{YIZcbIkQ~!EVi*Q6!srA{~lDPZ)%7j=P5>j0vDO3O8cn;niVN zsnY#*B;^uN;UKwYA)OfzVZMnR12}{05BbpO%#U<0lvD*rTaz469W9-pmh%9}&pK`?{;SY`Yhb|0D z7|5ygD`tqnkD+4D+GoAqLl1-n0s#_G8Z}5`@*pqD#JNiUpzLS2o)Eqafv$0P}eJ1ZMwC9FDXP5i(r4+OQ`LDInqd|iiHkpk(g4( z6CxFi!v&Hjqqixs!zc|&=u%MFg2n@F!P#^A+5D3RYLTcU|3ovn*fb|`JyzkERguqpS_;%WRRK$Z@8)p<7b3+7T5$Qz<_k#bDYquIJ%ma!tANBB ztM29-PF7?@xBQ19q1&w=yq;=YZ9CFme7lUvnlV>E)I47njwi z51Xei-q!Hs*0$Z>_5Y5C)ogQkBB{;k^7WMDx_&$~tZE;yy{nmyJTq3^f z?C0w1p#%jPR!oupDq=)EUODmpf$kHHMK#FynK|n|S@l*+>-P3>G5HL}LXRJNM>@YJ z;Eg7@_qcGev#_PA>F~g5;ry0aYw-I>-|yb2M%RH)s@j;GG?q`vo4-bas?eqJo^8K< zSjm>Gt6sXJanmcm?oM6h&-zq~+;6&1K0RmcQ?;uF(l*Ajv34~MQ1&@iQavrFh$Tju zT8gNRy`A49={26Fo6h{A>jxzL@Qf8Mi#^P94|tZ8yNU-xH;xRR(YzA8iZEFBJyr0)xI;k0zKu>bmxuP@lVzIyqybuH*O+Xl~H3k*zb zJqokIWy8$-@cZP@Wj&Lx`uk50w=bJI|LvydfSBM>y~{*6>5(b*cy3n9qc!*9;InJ3 zI&VP@LDFtV!FViqsOO~KmHe{e(g^A2>mOR}S+uxh_Tq}Uc=++V}%j;a-kdwyJLx-T7Jx$F(eB4D}*GHER?)&?= z^s2*Z&x(r}5!0kcxnOJWsV8bz?bV|j8cB+r^hgA%i%9U)NWorh+wHOuM~;Ty8}N>B zvN{=kMN8`rpRo`pk&&E~`>Kr~}b>#jE4J>K7=&iKuEU%)*uN-YYqu zqk>$97^l7#gQxkQK#d_u|9Hv)^SfZGV;{(2h$FO9*cqfrI;}?-Ds@IONMm9@bSTfz zWGI;$@RTc0+fiAQ6+iyUNq706lqEHpO|5#<`M*s{gt_d7m`?cVzjs~oW}TLk#u-AR l==R3{=Ku0;d)$$v{{>7K=Yd~LktP5D002ovPDHLkV1m#o7Bc_< diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png deleted file mode 100644 index 2859734ccff640e2a13bffe4bc3abf459ff11a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmV<810DQ{P)@7Px>vxi!&CJg3tXBLuFf-?T=QrQ& zd@~~6kBGTzofAP9tRe(HHxo}|Dvr@v%qHJ~yS^SD`oIC{EEW``GDs@OWZ4qY!($kj z`d?g;hf@T{Ew5y=kh4f+P%Xi2N6?L*``P5%acz1i2|Y?QcvMMPX<;}2*1oybDp%so zv}m+;a>@O988Znp9eQiC8;_z$$r`RzG}{wRVLFM?SEbG4vAY#6I}$RU zL^a%k;A$xh%zzPXz1w2>IUUHwHRI@`fC7~qS8yKt3$|5N&Q}T5t z6mFoxnuac>HVLgBJeovO&dvC$u&N5R70h0eVq8O=IYih6tn*^{Wp2;M&G0(VP=n5g zIh`$jmMf1%g&DaHi-&b9ia_2>x=E(XaY-x! zTou?Jz{EU)wODOqb?UCb1|MF;*gW~<)Eq+Ms$nzblDI9HbHG!HfSo}}D4H+R2sN`* zdo9Hav^kXEmsnx zGk@Q_Ie6#RjuRbCA%|qUJ=}Bbud7%*Ku6m4x7Dl}iA8tTZ#dd_S!b{6oXSmRj8?}p zsoRm>&FP(*NV#=i%>%y7#TwF*HBXHP#oCHD5mkhQ3pxS5;S3F75pD zMgN7zoue_%Zuqbu0awCnI6mo|A?Vsc_EKE-pq z$O#W;Bh#r@UfYW9iTj1y5(VcXt&0QMwI{H3+sd`4!q@MNhy4yuXw{}~+fUNcp`P;t zb7NQgeF{9@U2YTM*c zq=9NPkzE|r{*|Sl0vVI@dhTz7Y%B@SnSJi)vzRIW7g20Ky*!>SyVG1=10gCq9c$c> Q_y7O^07*qoM6N<$g3oB-(EtDd diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png deleted file mode 100644 index 3f987be793a6b767d23446df626f1eaca9888a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2101 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png deleted file mode 100644 index c62f2d283a9ece9b562ed3f6d48604d2b558e842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2861 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png deleted file mode 100644 index 9565dc1f9c72a8f8b2fbb9fbec7a10897d44e37a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4009 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 Oq9`k<%U8*ofBPT(#@0~) diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png deleted file mode 100644 index 9a04de115e58271b9f967302a04d314a1185e7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 zcmV-&3XS!NP)Q-vbGa@?PS+puh)CyJLl}q%gY^UeRC|2AixeL!xt3|T4 zn*Q(b6ED+Jkj&&rDoYmGmduic3`rYO4+iMAyN&YvG`#9m_2(q!q1~2mJ8Z;lCxODL zT#nL~2rry%r#{KD zflDFe8f-3-&XSoFnNCuwuuM;EBRvBvueU0a^-Ki~bk*AJ?WEB|YMf*=K}{Frxw)2H zjR?BC=~0v(;C|n}3`weid$#$=P@J}5hgP2?hggz;*G_GfvE!*2bV!QkNReF~hGgYP z!ohI2f+%;zu~O;^U&0Yt3ogXXj)>(5MV%=`b_n0a!tEg4TWGL>452SXV`ddpB!kR_ zSc(Le#8fhGa*(Eojbp(OF-DLDobbcQ4NQ^b5Xce1tt7_5TjK7^fP^U+kau;`!wOdh z5XX-v@{t`(PDrS(BJV|_Qvw7ts>rdDlEhTJF)s(}2+#!rWH1%g&?;i+kz6**3}ZN7 z2vd<&3JlG;vGEiJ?|0CcF{SH=^<2pE1_7@KhRK2qVQ-L6ih|PE5H{3SADKXGtQ+@N zKwan3WGq1?$q|VQR#c=iN@LUHr3pPU0m4Yu2WXwC7CR%5aad+dDmqlK~;=u=-Ab%7JEaMtZS{C+)3rzNO{cYDxQLLCz&x720@G- z#W-Pa)afpc*mS>Ws8g+gRyRX<9i+;cPm7TUAa2&mcVx6yk;k{?$Bl5$I2eLzbhgO5 z0ro64Y|Oyw)R07|tBt+gxw-s{+#WO{iL>2Xqe;s@w0Qi}HmHSVc=BQ;J^?b7HYfyV<$4d*P5B&L3ohulceHo{8? zK^Z8QBu5CxYFuU>A>qGpKp>cuk#ptLJIx!LP=uwH+aY>n_YE& z+04S&NT~y~y4EfC4;K0Zdp419G#?D^YL$aHOtv}`?pMEzD!RrKz|3)y7;`7wqJW+> zwQ#D@Q>1lp36e0OoVWyT7PD9BHXwO3U)l8gh$hM1NqmlGuzaRTGK3~enUUPzM*9yH zCK9+o_)2>NmDY5Onvd2&1*&yOe=zRx1=^Mz0DR0wpSDJUJal-v;Bub2Pd;Vm_GY;S zr^=KhVONl0#tNSX5N&Sq8(9v_HsmIu5PD0WkhYHt}UGcs0-%c}+Obd_sM`Il_!u}X6{ zJ(5d{ve~nKozvSC2=d)Tdf|F(ESgS~ImG2de?da|>iVk(pFg;1ukuJHn>l@J@V5i+ zoQ}vT$lk^;^nU%9dN=vSg*OIgLWjTlbF`0yjz53)_az{eOCKFlJbD z;F5HkFD{n_huyKSW#``J`+t4m&DXBHZ}O^-Z(f|7pK0{hJ+bj2|3BRGSve66x~sZd zyU;j4b#)1bq##MH%7y@v-GBb^#pv(`Z{2~mhknxe-Jo~ zCy$JrSYi;loWT+r70F1v=!=R)T%8TS9s2mtwkKNy4POrKI5G8aGgm`$aHt)y(>(TIu$mOM!?CkIsOtp2a?d(uQYW& zP=60U_{Y(crk-jzUh$ILS(nf2;YF0k4Xi6i&q)8vyAHV>uBY1{c`&#GM=nIJ4Ma!E zA4&m&NqX$gZ*Qh{Kb1+HnKCh#6qs3@`zZX+1MLqVr0$Up%#_JdL$yXxu)4nT#b-CJ zqou^7Bd2bsG)kbxI6QP5BsoL4$9G5i%Nc~Kc&|fJ^Y;%r=&HY`)?2g5AN>B7ukC5R zA4jGVcV52uMoG647s7#vCp<4NWd7U4zorw>dLNzDcul6?ep?0HeSI}{uL zLH}>Y3XViVi3{OCfd0G7N2J}wT;|Ad{|oohZf~0jjj{Wh`=U4-iC{y@3T!!UVX}&3zNScx)vJmw1ILX9<<$;#LR=CEf zRu2+wb^Y)f`--ZcRnoN^TI(mu7%^U`kae*1_r`3~`uUI+NxTgDKE$n1U2Uwfx@%?d gf0F+zxGPBh7ixl!?Qg?#od5s;07*qoM6N<$g3wzkOaK4? diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png deleted file mode 100644 index 8992d80b5e677e06fb7c26c51057921f2fab06ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4599 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


pRt=ekgBSgCysr`#^$)g2g=zhqLTaAPesU0c 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 aOk_*&w{h~Nbs#(um diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png deleted file mode 100644 index 40a864fdeae4d5f0ffb94b6c9e0c92ce7f22c301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)%jICh*qtBSdVaaovQ;EI1@hkqq^3 zRQ%kQ*HDb(sg3uZ1$(^eCMVCIQT_0e`#F>n(5N+%8@4b>K6Y_YL#6H|V=8tsSXR*; z+SRpSN&K~-kGg@I7w5GQL%oB6!S}maEGkeX-b*`urv~HoNU10#an;1NKOpG&2~VXa^n`fsPo7suddb*mNklh7Of<$jFp4re?3Qgi&=yaYX1bl3-<+8<-Dy!!V&6C>Y2a$d$NY0PzlfZj4~@FW&sdYPxk`pM;Q^ZJwpSR0+xzswaEO}IsBm`uBqShb?zmdn)L1cA&Tx|uIV#rW?#AKrR{_Rx()2@z{J(jSAZM^s? zM4gP`Tt64$T3M082U)-gu0bZzSj}PE3W~2Acs3_QCBeBh$_3i=5kI>nyM9+ZTe)mU zXDSK!t0lZ&5u%b!B@j?}k_Urjm)zS`0KDITGUGd8sw(5s02g`#Q0;YST3oh}qPt*OA)YN@s)R+WJQxCxRT$G<#0))BtBmvc9lW z8CWhZT6vvXIj7g#S%@GDujKl)$ z)ASI|_VIaPI8?^(m1?C$v&DA>53q;F1%a&IJlJ72m^7u$ z4s-wBYkUG=?-NM7*VwdjP|9UJy9aMGcXR?SCMJeu~WX|J7ODP^VBdd3U3Pyrs+J_* zc1<$+)a+4rFmG~k2$BZT?{?_Ma-yFaJvuaK@04D@r-3yOa&ZWfu2-0`u9BYP)8U9r z92O6vs1*6QU*qwsQ`$YEBV+!A89~zJB7d&yRQ6pTjhJ-LqVABo;@RWIL?$#ZB*#-mUjwKeu#A1Cm}Q*w0VF;>e<`0cM&<}lTRq0 z^R7ga%^8ty59oD=>~M})m|Dz;Q%~+Y?y{h=g~)QXS*Qmr@1WzPP)Iyd#}qJr`l*)~ zZakGi@g48_HRG5KaHNgF1c z-5A*uXk=HFqBFiO6vJVsN~fnH-7uX2f(Qh>*GO{{kAg}MH=Hr*j~hkrtE7@n;yntk z0JyNt#+Zbd$0^}WJ&^n)A|10FVO+~Qk#B32bZwGXUe)>YtQ$K4PkeOC8JBZZ3Gzuq z8nGvdA?o7phTw`M;dxB_g9}3mLlc$$%a5GkrwB2J);X#7NCNu-%_awwofy(c9&E-W zszxL|QANT!JaFg0{))NqgjsqI5^4=sikuEsj|U?|@&i{M)_DMrI}oAxn|t)bE;ajs zX>fD4m|=glB1HktGKI|$Tp$}%;C+ji`0o?1$%Guu&MNaNmyC!$Z#qow+k5ompWZY? z6PSdJx-Kt1pe+#gyKo~V18F>Fy~u=M`{4cSK3~L&BYz;VvRfs#vx?#v075iGYe!9g zG+EJTIliEjX-KxNDcF=XZhAl&c13;h^fMMJ9(23p=%^xGuWhyC)&gGAjwY&YfANoy ztw1)?Ahe;=OJR{nDF;J`3gYmR@6PZxt9d#TAqg%8!nQS@L<=rI(a+AFGzp7@lKj*2 zaNXrqeKsrutfet<6>dXaY{7fNFyGfiGiGg#D$e?q)$6 z4@Sa{)rZu}@i&CQ85*6t;S;Z?M;x;hv&^UcfaXaB><8YhULv#2#Rx3;`iJJ*7$qsU z=Gq>DlH6V5Sd&ZKe8c2OMs(pDMRvD4IjkhrxNJEt4d5c%%~|X%IY`i!VQtyJE3(+6 zt&!Bmf}~MCjTY%Oq`PWi(kL<3WGUihVaz$`KrYthO^b1V9uCCUgN%@#e;*f6dg0%5K9O{{Cn4n~4C~9aH@#HOAJRet`hmz>0L>G^& zgo`r!@-Dx+*FIO`~~=x6`H2 zJ9S(wpscXwkr%jOQ5Sz1!f^275O2Cm%_#Qk6{rF(NH87nT#~;OK0&ExKlPVFNxKck zswgaz!i+NQGhuN9HC7LEIaMX>l(5%o8=O+0?>+1#$NT9srU7UqUUacxm4Hc`v5>2tq{Mh;blMSZJ=mu+m9*tDVyOx>g} zx|zf!$pQ)~?AGyPfMy<-Ro17)6mC}W^EX?km@Daqe+ ziMYywzqYd;t{ku X{2RGMo3C-@00000NkvXXu0mjfne$Eo diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png deleted file mode 100644 index 7106c08f484fad38df0cbf809848359bdd8c9834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 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 AcmMzZ diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png deleted file mode 100644 index 98d270d271118ddaa5aba882a6b6d1d8ff0ea801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png deleted file mode 100644 index 779282c12191fad4e7d046e5ddb73f885b17781e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 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 JPDHLkV1iRG4_N>J diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png deleted file mode 100644 index 41a3dd2257afee329a47a0ecd4441c617c915c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 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 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json deleted file mode 100644 index bbde14f4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-60x60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-60x60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-20x20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-76x76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-76x76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-83.5x83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "AppIcon-prod-1024x1024@1x.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Info.plist index fd74b1c1..80173535 100644 --- a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Info.plist +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Info.plist @@ -2,8 +2,12 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + WonderWords CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -18,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Runner.entitlements b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/config/dev/.ignore b/11-create-your-own-widget-catalog/projects/starter/ios/config/dev/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/config/dev/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/starter/ios/config/dev/GoogleService-Info.plist deleted file mode 100644 index 94f3bdbd..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/ios/config/dev/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.67633443658-glol0em217f3bkcehn78440pa8uk7tir - API_KEY - AIzaSyCtQjSC3EiD5tDtJ4-fHh1bPAUASZfVAgo - GCM_SENDER_ID - 67633443658 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWordsDev - PROJECT_ID - wonder-words-dev - STORAGE_BUCKET - wonder-words-dev.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:67633443658:ios:ee73f9ddc856f860a8c7b3 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/config/prod/.ignore b/11-create-your-own-widget-catalog/projects/starter/ios/config/prod/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/starter/ios/config/prod/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/starter/ios/config/prod/GoogleService-Info.plist deleted file mode 100644 index e9062159..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/ios/config/prod/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 581028325132-6r6rdr8jhgfirrkretftm19das1a4cks.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.581028325132-6r6rdr8jhgfirrkretftm19das1a4cks - API_KEY - AIzaSyCz_4fRFcYhGt-9j0VmDLitKNLTVYWCf7U - GCM_SENDER_ID - 581028325132 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWords - PROJECT_ID - wonder-words-prod - STORAGE_BUCKET - wonder-words-prod.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:581028325132:ios:f2a34dfc51420c7111cb29 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/dynamic_link.dart b/11-create-your-own-widget-catalog/projects/starter/lib/dynamic_link.dart deleted file mode 100644 index 6faba8b6..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/lib/dynamic_link.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:package_info/package_info.dart'; - -class DynamicLink { - static const _domainUriPrefix = 'https://wonderwordsdev.page.link'; - - final String path; - final SocialMetaTagParameters? socialMetaTagParameters; - - DynamicLink({ - required this.path, - this.socialMetaTagParameters, - }); - - Future get url async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: _domainUriPrefix, - link: Uri.parse( - '$_domainUriPrefix$path', - ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, - ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', - ), - socialMetaTagParameters: socialMetaTagParameters, - ); - - final shortLink = await parameters.buildShortLink(); - return shortLink.shortUrl.toString(); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/generated_plugin_registrant.dart b/11-create-your-own-widget-catalog/projects/starter/lib/generated_plugin_registrant.dart deleted file mode 100644 index ed74637e..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,22 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars - -import 'package:firebase_analytics_web/firebase_analytics_web.dart'; -import 'package:firebase_core_web/firebase_core_web.dart'; -import 'package:share_plus_web/share_plus_web.dart'; -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - FirebaseAnalyticsWeb.registerWith(registrar); - FirebaseCoreWeb.registerWith(registrar); - SharePlusPlugin.registerWith(registrar); - UrlLauncherPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/main.dart b/11-create-your-own-widget-catalog/projects/starter/lib/main.dart index 7af4fa3b..1daed5a7 100644 --- a/11-create-your-own-widget-catalog/projects/starter/lib/main.dart +++ b/11-create-your-own-widget-catalog/projects/starter/lib/main.dart @@ -1,17 +1,15 @@ import 'dart:async'; +import 'dart:isolate'; import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -20,22 +18,55 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { - WidgetsFlutterBinding.ensureInitialized(); - runApp( - const WonderWords(), + // Has to be late so it doesn't instantiate before the + // `initializeMonitoringPackage()` call. + late final errorReportingService = ErrorReportingService(); + + runZonedGuarded>( + () async { + WidgetsFlutterBinding.ensureInitialized(); + await initializeMonitoringPackage(); + + final remoteValueService = RemoteValueService(); + await remoteValueService.load(); + + FlutterError.onError = errorReportingService.recordFlutterError; + + Isolate.current.addErrorListener( + RawReceivePort((pair) async { + final List errorAndStacktrace = pair; + await errorReportingService.recordError( + errorAndStacktrace.first, + errorAndStacktrace.last, + ); + }).sendPort, + ); + + runApp( + WonderWords( + remoteValueService: remoteValueService, + ), + ); + }, + (error, stack) => errorReportingService.recordError( + error, + stack, + fatal: true, + ), ); - log.i('Info Logger'); - log.d('Debug Logger'); - log.e('Error Logger'); - log.w('Warn Logger'); } class WonderWords extends StatefulWidget { - const WonderWords({Key? key}) : super(key: key); + const WonderWords({ + required this.remoteValueService, + Key? key, + }) : super(key: key); + + final RemoteValueService remoteValueService; @override _WonderWordsState createState() => _WonderWordsState(); @@ -43,6 +74,8 @@ class WonderWords extends StatefulWidget { class _WonderWordsState extends State { final _keyValueStorage = KeyValueStorage(); + final _analyticsService = AnalyticsService(); + final _dynamicLinkService = DynamicLinkService(); late final _favQsApi = FavQsApi( userTokenSupplier: () => _userRepository.getUserToken(), ); @@ -54,47 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ - ScreenViewObserver(), + ScreenViewObserver( + analyticsService: _analyticsService, + ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); - _openInitialDynamicLinkIfAny(); - _setupDynamicLinksListener(); - } - Future _setupDynamicLinksListener() async { - FirebaseDynamicLinks.instance.onLink( - onSuccess: ( - PendingDynamicLinkData? dynamicLink, - ) async { - final Uri? deepLink = dynamicLink?.link; + _openInitialDynamicLinkIfAny(); - if (deepLink != null) { - _navigator.push(deepLink.path); - } - }, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final PendingDynamicLinkData? data = - await FirebaseDynamicLinks.instance.getInitialLink(); - final Uri? deepLink = data?.link; - - if (deepLink != null) { - _navigator.push(deepLink.path); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); + if (path != null) { + _routerDelegate.push(path); } } @@ -104,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -111,27 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/routes.dart b/11-create-your-own-widget-catalog/projects/starter/lib/routes.dart deleted file mode 100644 index 988faaf8..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/lib/routes.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/dynamic_link.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? ''), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => DynamicLink( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ).url, - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '$signInPath/sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/routing_table.dart b/11-create-your-own-widget-catalog/projects/starter/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/screen_view_observer.dart b/11-create-your-own-widget-catalog/projects/starter/lib/screen_view_observer.dart index 97c7518b..ad8e53a3 100644 --- a/11-create-your-own-widget-catalog/projects/starter/lib/screen_view_observer.dart +++ b/11-create-your-own-widget-catalog/projects/starter/lib/screen_view_observer.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:monitoring/monitoring.dart'; import 'package:routemaster/routemaster.dart'; -typedef ScreenNameExtractor = String? Function(RouteSettings settings); - -String? defaultNameExtractor(RouteSettings settings) => settings.name; - class ScreenViewObserver extends RoutemasterObserver { ScreenViewObserver({ - this.nameExtractor = defaultNameExtractor, - Function(PlatformException error)? onError, - }) : _onError = onError; + required this.analyticsService, + }); + + final AnalyticsService analyticsService; + + void _sendScreenView(PageRoute route) { + final String? screenName = route.settings.name; - final ScreenNameExtractor nameExtractor; - final void Function(PlatformException error)? _onError; + if (screenName != null) { + analyticsService.setCurrentScreen(screenName); + } + } @override void didPush(Route route, Route? previousRoute) { @@ -31,24 +32,4 @@ class ScreenViewObserver extends RoutemasterObserver { _sendScreenView(previousRoute); } } - - @override - void didChangeRoute(RouteData routeData, Page page) {} - - void _sendScreenView(PageRoute route) { - final String? screenName = nameExtractor(route.settings); - if (screenName != null) { - analytics.setCurrentScreen(screenName: screenName).catchError( - (Object error) { - final _onError = this._onError; - if (_onError == null) { - log.e('$ScreenViewObserver: $error'); - } else { - _onError(error as PlatformException); - } - }, - test: (Object error) => error is PlatformException, - ); - } - } } diff --git a/11-create-your-own-widget-catalog/projects/starter/lib/home_screen.dart b/11-create-your-own-widget-catalog/projects/starter/lib/tab_container_screen.dart similarity index 92% rename from 11-create-your-own-widget-catalog/projects/starter/lib/home_screen.dart rename to 11-create-your-own-widget-catalog/projects/starter/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/11-create-your-own-widget-catalog/projects/starter/lib/home_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/11-create-your-own-widget-catalog/projects/starter/makefile b/11-create-your-own-widget-catalog/projects/starter/makefile index 3f640d71..dd578f08 100644 --- a/11-create-your-own-widget-catalog/projects/starter/makefile +++ b/11-create-your-own-widget-catalog/projects/starter/makefile @@ -10,6 +10,14 @@ print: echo $${package} ; \ done +pods-clean: + rm -Rf ios/Pods ; \ + rm -Rf ios/.symlinks ; \ + rm -Rf ios/Flutter/Flutter.framework ; \ + rm -Rf ios/Flutter/Flutter.podspec ; \ + rm ios/Podfile ; \ + rm ios/Podfile.lock ; \ + get: flutter pub get @@ -26,6 +34,21 @@ get: cd ../../ ; \ done +upgrade: + flutter pub upgrade + for feature in $(FEATURES); do \ + cd $${feature} ; \ + echo "Updating dependencies on $${feature}" ; \ + flutter pub upgrade ; \ + cd ../../../ ; \ + done + for package in $(PACKAGES); do \ + cd $${package} ; \ + echo "Updating dependencies on $${package}" ; \ + flutter pub upgrade ; \ + cd ../../ ; \ + done + lint: flutter analyze diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config.json deleted file mode 100644 index f97d4ac4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config.json +++ /dev/null @@ -1 +0,0 @@ -{"configVersion":2,"packages":[{"name":"_fe_analyzer_shared","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"analyzer","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0","packageUri":"lib/","languageVersion":"2.14"},{"name":"archive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"args","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"auto_size_text","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"boolean_selector","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"characters","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"charcode","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"cli_util","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"clock","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"collection","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"convert","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"coverage","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"crypto","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"fake_async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"file","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter","rootUri":"file:///Users/vid/flutter/packages/flutter","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_localizations","rootUri":"file:///Users/vid/flutter/packages/flutter_localizations","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_svg","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_test","rootUri":"file:///Users/vid/flutter/packages/flutter_test","packageUri":"lib/","languageVersion":"2.12"},{"name":"frontend_server_client","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"glob","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"graphs","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"http","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_multi_server","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_parser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"intl","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"io","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"js","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"logging","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"lottie","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"matcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11","packageUri":"lib/","languageVersion":"2.12"},{"name":"material_color_utilities","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3","packageUri":"lib/","languageVersion":"2.13"},{"name":"meta","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mime","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mocktail","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"node_preamble","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"package_config","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_drawing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_parsing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"pedantic","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"petitparser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pool","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pub_semver","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"rive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_packages_handler","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_static","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_web_socket","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"sky_engine","rootUri":"file:///Users/vid/flutter/bin/cache/pkg/sky_engine","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_map_stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_maps","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_span","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"stream_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"string_scanner","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"term_glyph","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"test","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5","packageUri":"lib/","languageVersion":"2.14"},{"name":"test_api","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8","packageUri":"lib/","languageVersion":"2.12"},{"name":"test_core","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9","packageUri":"lib/","languageVersion":"2.14"},{"name":"typed_data","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"vector_math","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1","packageUri":"lib/","languageVersion":"2.14"},{"name":"vm_service","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"watcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"web_socket_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"webkit_inspection_protocol","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"xml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"yaml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"component_library","rootUri":"../","packageUri":"lib/","languageVersion":"2.14"},{"name":"flutter_gen","rootUri":"flutter_gen","languageVersion":"2.12"}],"generated":"2022-04-19T00:28:25.765140Z","generator":"pub","generatorVersion":"2.16.2"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config_subset deleted file mode 100644 index 79519366..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/package_config_subset +++ /dev/null @@ -1,293 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.packages deleted file mode 100644 index 4a988019..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/.packages +++ /dev/null @@ -1,79 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:25.740563. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -component_library:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/closing-quote.svg b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/closing-quote.svg +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/opening-quote.svg b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/opening-quote.svg index 72e00372..c32e06de 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/opening-quote.svg +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/assets/opening-quote.svg @@ -1,16 +1 @@ - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/component_storybook.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/component_storybook.dart index 50be50bd..6b26f9a2 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/component_storybook.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:component_library_storybook/stories.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:storybook_flutter/storybook_flutter.dart'; @@ -16,16 +15,7 @@ class ComponentStorybook extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); return Storybook( - theme: lightThemeData, - darkTheme: darkThemeData, - localizationDelegates: const [ - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ComponentLibraryLocalizations.delegate, - ], children: [ ...getStories(theme), ], diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/stories.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/stories.dart index 9964bd4b..7d39be47 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/stories.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/stories.dart @@ -75,9 +75,7 @@ List getStories(WonderThemeData theme) { section: 'Count Indicator Buttons', builder: (_, k) => UpvoteIconButton( // TODO: replace with implementation of int knob - count: k.sliderInt( - label: 'count', - ), + count: 2, onTap: () {}, isUpvoted: k.boolean( label: 'isUpvoted', @@ -105,14 +103,6 @@ List getStories(WonderThemeData theme) { : null, ), ), - Story.simple( - name: 'Loading Indicator', - section: 'Indicators', - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 200.0), - child: LoadingIndicator(), - ), - ), Story( name: 'QuoteCard', section: 'Quote', @@ -122,9 +112,10 @@ List getStories(WonderThemeData theme) { initial: false, ), statement: k.text( - label: 'Statement', - initial: - 'Wherever you go, no matter what the weather, always bring your own sunshine.'), + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), author: k.text( label: 'Author', initial: 'Author name', @@ -177,6 +168,10 @@ List getStories(WonderThemeData theme) { ), ), ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), Story( name: 'Rounded Choice Chip', padding: const EdgeInsets.all( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/story_app.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/story_app.dart index 04f2fa44..1c1b2ad1 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/story_app.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/lib/story_app.dart @@ -19,4 +19,4 @@ class StoryApp extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.lock deleted file mode 100644 index 3af732ee..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.lock +++ /dev/null @@ -1,327 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.6" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: ".." - relative: true - source: path - version: "0.0.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - device_frame: - dependency: transitive - description: - name: device_frame - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - freezed_annotation: - dependency: transitive - description: - name: freezed_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "0.15.0" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - recase: - dependency: transitive - description: - name: recase - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.32" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - storybook_flutter: - dependency: "direct main" - description: - name: storybook_flutter - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.yaml index 638d550b..b295e253 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/example/pubspec.yaml @@ -1,4 +1,5 @@ name: component_library_storybook +version: 1.0.0+1 publish_to: none environment: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/component_library.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/component_library.dart index 69dca4a5..b70367c1 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/component_library.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/component_library.dart @@ -22,4 +22,3 @@ export 'src/theme/spacing.dart'; export 'src/theme/wonder_theme.dart'; export 'src/theme/wonder_theme_data.dart'; export 'src/upvote_icon_button.dart'; -export 'src/loading_indicator.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/count_indicator_icon_button.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/count_indicator_icon_button.dart index 83954a16..66558e26 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/count_indicator_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/count_indicator_icon_button.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class CountIndicatorIconButton extends StatefulWidget { +class CountIndicatorIconButton extends StatelessWidget { const CountIndicatorIconButton({ required this.count, required this.iconData, @@ -18,39 +17,26 @@ class CountIndicatorIconButton extends StatefulWidget { final String? tooltip; final VoidCallback? onTap; - @override - State createState() => - _CountIndicatorIconButtonState(); -} - -class _CountIndicatorIconButtonState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { @override Widget build(BuildContext context) { - return ScaleTransition( - scale: scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: widget.tooltip, - padding: const EdgeInsets.all(0), - icon: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - widget.iconData, - color: widget.iconColor, - ), - Text( - widget.count.toString(), - style: const TextStyle( - fontSize: FontSize.small, - ), + return IconButton( + onPressed: onTap, + tooltip: tooltip, + padding: const EdgeInsets.all(0), + icon: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + iconData, + color: iconColor, + ), + Text( + count.toString(), + style: const TextStyle( + fontSize: FontSize.small, ), - ], - ), + ), + ], ), ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/exception_indicator.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/exception_indicator.dart index e8df8722..9a2259e8 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/exception_indicator.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/exception_indicator.dart @@ -1,7 +1,5 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:rive/rive.dart'; class ExceptionIndicator extends StatelessWidget { const ExceptionIndicator({ @@ -27,15 +25,12 @@ class ExceptionIndicator extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const SizedBox( - height: 200, - child: RiveAnimation.asset( - 'assets/animations/on_off_switch.riv', - animations: ['Off'], - ), + const Icon( + Icons.error, + size: 48, ), const SizedBox( - height: Spacing.medium, + height: Spacing.xxLarge, ), Text( title ?? l10n.exceptionIndicatorGenericTitle, diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/expanded_elevated_button.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/expanded_elevated_button.dart index 3622c159..d6cefe3f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/expanded_elevated_button.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/expanded_elevated_button.dart @@ -28,6 +28,7 @@ class ExpandedElevatedButton extends StatelessWidget { @override Widget build(BuildContext context) { + final icon = this.icon; return SizedBox( height: _elevatedButtonHeight, width: double.infinity, diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/favorite_icon_button.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/favorite_icon_button.dart index 51933644..44092c1d 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/favorite_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/favorite_icon_button.dart @@ -1,7 +1,7 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -class FavoriteIconButton extends StatefulWidget { +class FavoriteIconButton extends StatelessWidget { const FavoriteIconButton({ required this.isFavorite, this.onTap, @@ -11,59 +11,14 @@ class FavoriteIconButton extends StatefulWidget { final bool isFavorite; final VoidCallback? onTap; - @override - State createState() => _FavoriteIconButtonState(); -} - -class _FavoriteIconButtonState extends State - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.8; - double partition = 0.7; - Duration duration = kThemeAnimationDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - _scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), - weight: partition, - ), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), - weight: 1 - partition, - ) - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } - @override Widget build(BuildContext context) { final l10n = ComponentLibraryLocalizations.of(context); - return ScaleTransition( - scale: _scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: l10n.favoriteIconButtonTooltip, - icon: Icon( - widget.isFavorite ? Icons.favorite : Icons.favorite_border_outlined, - ), + return IconButton( + onPressed: onTap, + tooltip: l10n.favoriteIconButtonTooltip, + icon: Icon( + isFavorite ? Icons.favorite : Icons.favorite_border_outlined, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart index eca59dc4..9c334bc7 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -60,15 +60,18 @@ import 'component_library_localizations_en.dart'; /// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales /// property. abstract class ComponentLibraryLocalizations { - ComponentLibraryLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + ComponentLibraryLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static ComponentLibraryLocalizations of(BuildContext context) { - return Localizations.of(context, ComponentLibraryLocalizations)!; + return Localizations.of( + context, ComponentLibraryLocalizations)!; } - static const LocalizationsDelegate delegate = _ComponentLibraryLocalizationsDelegate(); + static const LocalizationsDelegate delegate = + _ComponentLibraryLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -80,7 +83,8 @@ abstract class ComponentLibraryLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ + static const List> localizationsDelegates = + >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -89,7 +93,8 @@ abstract class ComponentLibraryLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @downvoteIconButtonTooltip. @@ -159,33 +164,37 @@ abstract class ComponentLibraryLocalizations { String get authenticationRequiredErrorSnackbarMessage; } -class _ComponentLibraryLocalizationsDelegate extends LocalizationsDelegate { +class _ComponentLibraryLocalizationsDelegate + extends LocalizationsDelegate { const _ComponentLibraryLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture(lookupComponentLibraryLocalizations(locale)); + return SynchronousFuture( + lookupComponentLibraryLocalizations(locale)); } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations lookupComponentLibraryLocalizations(Locale locale) { - - +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( + Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': return ComponentLibraryLocalizationsEn(); + case 'en': + return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( - 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' - ); + 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index abbb4044..bb2968c0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'component_library_localizations.dart'; /// The translations for English (`en`). @@ -32,11 +29,14 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { String get exceptionIndicatorTryAgainButton => 'Try Again'; @override - String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.'; + String get exceptionIndicatorGenericMessage => + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override - String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.'; + String get genericErrorSnackbarMessage => + 'There has been an error. Please, check your internet connection.'; @override - String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.'; + String get authenticationRequiredErrorSnackbarMessage => + 'You need to sign in before performing this action.'; } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/loading_indicator.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/loading_indicator.dart deleted file mode 100644 index 0f589516..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/loading_indicator.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:lottie/lottie.dart'; - -class LoadingIndicator extends StatelessWidget { - const LoadingIndicator({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 32, - horizontal: 16, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Lottie.asset('assets/animations/loader.json'), - ], - ), - ), - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/mixins/animation_mixin.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/mixins/animation_mixin.dart deleted file mode 100644 index 3dea8ef7..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/mixins/animation_mixin.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -mixin ScaleAnimationMixin - on SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.7; - double partition = 0.5; - Duration duration = kThemeChangeDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), weight: partition), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), weight: partition), - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/quote_card.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/quote_card.dart index f58fc2b1..5428cb36 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/quote_card.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/quote_card.dart @@ -44,10 +44,14 @@ class QuoteCard extends StatelessWidget { child: top, ), const Spacer(), - FavoriteIconButton( - isFavorite: isFavorite, - onTap: onFavorite, - ), + IconButton( + onPressed: onFavorite, + icon: Icon( + isFavorite + ? Icons.favorite + : Icons.favorite_border_outlined, + ), + ) ], ), Padding( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/rounded_choice_chip.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/rounded_choice_chip.dart index ad9327d7..46806b51 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/rounded_choice_chip.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/rounded_choice_chip.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class RoundedChoiceChip extends StatefulWidget { +class RoundedChoiceChip extends StatelessWidget { const RoundedChoiceChip({ required this.label, required this.isSelected, @@ -24,44 +23,29 @@ class RoundedChoiceChip extends StatefulWidget { final Color? selectedBackgroundColor; final bool isSelected; - @override - State createState() => _RoundedChoiceChipState(); -} - -class _RoundedChoiceChipState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { - @override - double get scaleTo => 0.9; - @override Widget build(BuildContext context) { - final WonderThemeData theme = WonderTheme.of(context); - return ScaleTransition( - scale: scaleAnimation, - child: ChoiceChip( - shape: const StadiumBorder( - side: BorderSide(), - ), - avatar: widget.avatar, - label: Text( - widget.label, - style: TextStyle( - color: widget.isSelected - ? (widget.selectedLabelColor ?? - theme.roundedChoiceChipSelectedLabelColor) - : (widget.labelColor ?? theme.roundedChoiceChipLabelColor), - ), + final theme = WonderTheme.of(context); + return ChoiceChip( + shape: const StadiumBorder( + side: BorderSide(), + ), + avatar: avatar, + label: Text( + label, + style: TextStyle( + color: isSelected + ? (selectedLabelColor ?? + theme.roundedChoiceChipSelectedLabelColor) + : (labelColor ?? theme.roundedChoiceChipLabelColor), ), - onSelected: (isSelected) { - widget.onSelected?.call(isSelected); - animate(); - }, - selected: widget.isSelected, - backgroundColor: - (widget.backgroundColor ?? theme.roundedChoiceChipBackgroundColor), - selectedColor: (widget.selectedBackgroundColor ?? - theme.roundedChoiceChipSelectedBackgroundColor), ), + onSelected: onSelected, + selected: isSelected, + backgroundColor: + (backgroundColor ?? theme.roundedChoiceChipBackgroundColor), + selectedColor: (selectedBackgroundColor ?? + theme.roundedChoiceChipSelectedBackgroundColor), ); } } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/search_bar.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/search_bar.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart index e938e794..fab49c3f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/src/theme/wonder_theme_data.dart @@ -6,12 +6,6 @@ const _dividerThemeData = DividerThemeData( space: 0, ); -ElevatedButtonThemeData get buttonThemeData => ElevatedButtonThemeData( - style: ButtonStyle( - shape: const StadiumBorder().materialize(), - ), - ); - // If the number of properties get too big, we can start grouping them in // classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. abstract class WonderThemeData { @@ -19,14 +13,8 @@ abstract class WonderThemeData { double screenMargin = Spacing.mediumLarge; - double searchBarMargin = Spacing.xSmall; - double gridSpacing = Spacing.mediumLarge; - double listSpacing = Spacing.mediumLarge; - - double inputDecorationBorderRadius = Spacing.medium; - Color get roundedChoiceChipBackgroundColor; Color get roundedChoiceChipSelectedBackgroundColor; @@ -45,25 +33,6 @@ abstract class WonderThemeData { Color get votedButtonColor; - Color get textFieldBorderColor; - - MaterialColor get fabBackgroundColor; - - MaterialColor get fabForegroundColor; - - FloatingActionButtonThemeData get fabThemeData => - FloatingActionButtonThemeData( - backgroundColor: fabBackgroundColor.shade600, - foregroundColor: fabForegroundColor, - ); - - InputDecorationTheme get inputDecorationTheme => InputDecorationTheme( - border: OutlineInputBorder( - borderSide: BorderSide(color: textFieldBorderColor), - borderRadius: BorderRadius.circular(inputDecorationBorderRadius), - ), - ); - TextStyle quoteTextStyle = const TextStyle( fontFamily: 'Fondamento', package: 'component_library', @@ -76,9 +45,6 @@ class LightWonderThemeData extends WonderThemeData { brightness: Brightness.light, primarySwatch: Colors.black.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -107,15 +73,6 @@ class LightWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.black; - - @override - MaterialColor get fabBackgroundColor => Colors.black.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.white.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.black; } class DarkWonderThemeData extends WonderThemeData { @@ -125,9 +82,6 @@ class DarkWonderThemeData extends WonderThemeData { toggleableActiveColor: Colors.white, primarySwatch: Colors.white.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -156,15 +110,6 @@ class DarkWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.white; - - @override - MaterialColor get fabBackgroundColor => Colors.white.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.black.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.white; } extension on Color { @@ -186,9 +131,3 @@ extension on Color { _toSwatch(), ); } - -extension OutlinedBorderExtensions on OutlinedBorder { - MaterialStateProperty materialize() { - return MaterialStateProperty.all(this); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.lock deleted file mode 100644 index 6a3c9b3f..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: "direct main" - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: "direct main" - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.yaml index 0463ec20..d75f7082 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/pubspec.yaml @@ -9,10 +9,9 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter + intl: ^0.17.0 flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 - rive: ^0.7.28 - lottie: ^1.1.0 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config.json deleted file mode 100644 index fbff7f14..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:30.388766Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config_subset deleted file mode 100644 index 0c538771..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/package_config_subset +++ /dev/null @@ -1,201 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.packages deleted file mode 100644 index 7b3a56f7..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/.packages +++ /dev/null @@ -1,56 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:30.369716. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -domain_models:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/pubspec.lock deleted file mode 100644 index 095e6d55..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/domain_models/pubspec.lock +++ /dev/null @@ -1,348 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.6.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.10" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.8" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.19" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config.json deleted file mode 100644 index f7e3489b..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config.json +++ /dev/null @@ -1,440 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_serializable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:33.052187Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config_subset deleted file mode 100644 index 8534d2f7..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/package_config_subset +++ /dev/null @@ -1,289 +0,0 @@ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.packages deleted file mode 100644 index 6e668956..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/.packages +++ /dev/null @@ -1,78 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:33.033460. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -fav_qs_api:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.lock deleted file mode 100644 index 8f61c803..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/common_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config.json deleted file mode 100644 index 7a7e9fba..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:02.795699Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config_subset deleted file mode 100644 index 93df04c2..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins-dependencies deleted file mode 100644 index c2878bcb..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:02.938183","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.packages deleted file mode 100644 index d05c4eee..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:02.772926. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -forgot_my_password:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart index 49ca8b27..f40a9e51 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart @@ -19,13 +19,13 @@ class ForgotMyPasswordCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), ); @@ -35,7 +35,7 @@ class ForgotMyPasswordCubit extends Cubit { void onEmailUnfocused() { final newState = state.copyWith( - email: Email.dirty( + email: Email.validated( state.email.value, ), ); @@ -43,10 +43,10 @@ class ForgotMyPasswordCubit extends Cubit { } void onSubmit() async { - final email = Email.dirty(state.email.value); + final email = Email.validated(state.email.value); final newState = state.copyWith( email: email, - status: email.valid ? FormzStatus.submissionInProgress : state.status, + submissionStatus: email.valid ? SubmissionStatus.inProgress : null, ); emit(newState); if (email.valid) { @@ -55,12 +55,12 @@ class ForgotMyPasswordCubit extends Cubit { email.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, + submissionStatus: SubmissionStatus.success, ); emit(newState); - } catch (error) { + } catch (_) { final newState = state.copyWith( - status: FormzStatus.submissionFailure, + submissionStatus: SubmissionStatus.error, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart index 846998db..4be5eef2 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart @@ -66,7 +66,7 @@ class _ForgotMyPasswordViewState extends State { final l10n = ForgotMyPasswordLocalizations.of(context); return BlocConsumer( listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -86,7 +86,7 @@ class _ForgotMyPasswordViewState extends State { builder: (context, state) { final cubit = context.read(); final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final emailError = state.email.invalid ? state.email.error : null; return GestureDetector( onTap: () => _releaseFocus(context), @@ -100,6 +100,7 @@ class _ForgotMyPasswordViewState extends State { enabled: !isSubmissionInProgress, onEditingComplete: cubit.onSubmit, onChanged: cubit.onEmailChanged, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -113,18 +114,18 @@ class _ForgotMyPasswordViewState extends State { : l10n.emailTextFieldInvalidErrorMessage), ), ), - if (state.status.isSubmissionFailure) + if (state.submissionStatus == SubmissionStatus.error) ...[ const SizedBox( height: Spacing.medium, ), - if (state.status.isSubmissionFailure) Text( l10n.errorMessage, style: const TextStyle( color: Colors.red, fontSize: FontSize.medium, ), - ) + ), + ], ], ), actions: [ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart index 7701b4a5..333d7041 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart @@ -2,27 +2,34 @@ part of 'forgot_my_password_cubit.dart'; class ForgotMyPasswordState extends Equatable { const ForgotMyPasswordState({ - this.email = const Email.pure(), - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; - final FormzStatus status; + final SubmissionStatus submissionStatus; ForgotMyPasswordState copyWith({ Email? email, Password? password, - FormzStatus? status, + SubmissionStatus? submissionStatus, }) { return ForgotMyPasswordState( email: email ?? this.email, - status: status ?? this.status, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ email, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.lock deleted file mode 100644 index 37d2f6c8..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: transitive - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.yaml index da9acf75..fc6d79ab 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/forgot_my_password/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config.json deleted file mode 100644 index 7d8b3572..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config.json +++ /dev/null @@ -1,608 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:05.969702Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config_subset deleted file mode 100644 index c8ea237c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/package_config_subset +++ /dev/null @@ -1,401 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins-dependencies deleted file mode 100644 index 21bae646..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:06.116718","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.packages deleted file mode 100644 index 913dbbb7..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/.packages +++ /dev/null @@ -1,106 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:05.946104. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -profile_menu:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_en.arb index 12093a3b..2089593b 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_en.arb @@ -13,5 +13,7 @@ "darkModePreferencesAlwaysDarkTileLabel": "Always Dark", "darkModePreferencesAlwaysLightTileLabel": "Always Light", "darkModePreferencesUseSystemSettingsTileLabel": "Use System Settings", - "signOutButtonLabel": "Sign Out" + "signOutButtonLabel": "Sign Out", + "signUpOpeningText": "Don't have an account?", + "signUpButtonLabel": "Sign up" } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index d4904a02..71f77a0c 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -140,6 +144,18 @@ abstract class ProfileMenuLocalizations { /// In en, this message translates to: /// **'Sign Out'** String get signOutButtonLabel; + + /// No description provided for @signUpOpeningText. + /// + /// In en, this message translates to: + /// **'Don\'t have an account?'** + String get signUpOpeningText; + + /// No description provided for @signUpButtonLabel. + /// + /// In en, this message translates to: + /// **'Sign up'** + String get signUpButtonLabel; } class _ProfileMenuLocalizationsDelegate @@ -149,22 +165,24 @@ class _ProfileMenuLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupProfileMenuLocalizations(locale)); + lookupProfileMenuLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; } -ProfileMenuLocalizations _lookupProfileMenuLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart index bc456b36..098adb27 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart @@ -30,4 +30,10 @@ class ProfileMenuLocalizationsEn extends ProfileMenuLocalizations { @override String get signOutButtonLabel => 'Sign Out'; + + @override + String get signUpOpeningText => 'Don\'t have an account?'; + + @override + String get signUpButtonLabel => 'Sign up'; } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 6d4cd8ad..e3017b85 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,23 +1,27 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, required this.quoteRepository, this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; final VoidCallback? onUpdateProfileTap; + final VoidCallback? onSignUpTap; final UserRepository userRepository; final QuoteRepository quoteRepository; @@ -31,6 +35,7 @@ class ProfileMenuScreen extends StatelessWidget { child: ProfileMenuView( onSignInTap: onSignInTap, onUpdateProfileTap: onUpdateProfileTap, + onSignUpTap: onSignUpTap, ), ); } @@ -40,11 +45,13 @@ class ProfileMenuScreen extends StatelessWidget { class ProfileMenuView extends StatelessWidget { const ProfileMenuView({ this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; + final VoidCallback? onSignUpTap; final VoidCallback? onUpdateProfileTap; @override @@ -59,10 +66,26 @@ class ProfileMenuView extends StatelessWidget { final username = state.username; return Column( children: [ - if (!state.isUserAuthenticated) + if (!state.isUserAuthenticated) ...[ _SignInButton( onSignInTap: onSignInTap, ), + const SizedBox( + height: Spacing.xLarge, + ), + Text( + l10n.signUpOpeningText, + ), + TextButton( + child: Text( + l10n.signUpButtonLabel, + ), + onPressed: onSignUpTap, + ), + const SizedBox( + height: Spacing.large, + ), + ], if (username != null) ...[ Expanded( child: Center( @@ -101,10 +124,7 @@ class ProfileMenuView extends StatelessWidget { ], ); } else { - // TODO: replace with centered circular progress indicator - return const Center( - child: CircularProgressIndicator(), - ); + return const CenteredCircularProgressIndicator(); } }, ), @@ -127,9 +147,10 @@ class _SignInButton extends StatelessWidget { final theme = WonderTheme.of(context); final l10n = ProfileMenuLocalizations.of(context); return Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - vertical: Spacing.xxLarge, + padding: EdgeInsets.only( + left: theme.screenMargin, + right: theme.screenMargin, + top: Spacing.xxLarge, ), child: ExpandedElevatedButton( onTap: onSignInTap, diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.lock deleted file mode 100644 index 4291e695..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.lock +++ /dev/null @@ -1,691 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.yaml index c9d1921a..8f33a7c1 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: ^0.17.0 quote_repository: path: ../../quote_repository - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository domain_models: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config.json deleted file mode 100644 index 1eed9b2e..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config.json +++ /dev/null @@ -1,668 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:09.083408Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config_subset deleted file mode 100644 index 6475f3b0..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/package_config_subset +++ /dev/null @@ -1,441 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins deleted file mode 100644 index b3a1e738..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins +++ /dev/null @@ -1,13 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins-dependencies deleted file mode 100644 index 721c742c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/","dependencies":[]}],"web":[{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:09.242130","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.packages deleted file mode 100644 index 377e9d7f..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/.packages +++ /dev/null @@ -1,116 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:09.058164. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_details:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/l10n.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/quote_details.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/quote_details.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_cubit.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_cubit.dart index eb3f094e..597cc6ce 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_cubit.dart @@ -31,7 +31,7 @@ class QuoteDetailsCubit extends Cubit { } } - void refresh() { + Future refetch() async { emit( const QuoteDetailsInProgress(), ); @@ -39,37 +39,37 @@ class QuoteDetailsCubit extends Cubit { _fetchQuoteDetails(); } - void upvoteQuote() { - _executeQuoteUpdateOperation( + void upvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.upvoteQuote(quoteId), ); } - void downvoteQuote() { - _executeQuoteUpdateOperation( + void downvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.downvoteQuote(quoteId), ); } - void unvoteQuote() { - _executeQuoteUpdateOperation( + void unvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unvoteQuote(quoteId), ); } - void favoriteQuote() { - _executeQuoteUpdateOperation( + void favoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.favoriteQuote(quoteId), ); } - void unfavoriteQuote() { - _executeQuoteUpdateOperation( + void unfavoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unfavoriteQuote(quoteId), ); } - void _executeQuoteUpdateOperation( + Future _executeQuoteUpdateOperation( Future Function() updateQuote, ) async { try { @@ -85,7 +85,7 @@ class QuoteDetailsCubit extends Cubit { emit( QuoteDetailsSuccess( quote: lastState.quote, - eventError: error, + quoteUpdateError: error, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart index c84708ec..afb67e36 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/src/l10n/quote_details_localizations.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,105 +43,64 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); return StyledStatusBar.dark( child: BlocConsumer( listener: (context, state) { - final eventError = - state is QuoteDetailsSuccess ? state.eventError : null; - if (eventError != null) { - final snackBar = eventError is UserAuthenticationRequiredException - ? const AuthenticationRequiredErrorSnackBar() - : const GenericErrorSnackBar(); + final quoteUpdateError = + state is QuoteDetailsSuccess ? state.quoteUpdateError : null; + if (quoteUpdateError != null) { + final snackBar = + quoteUpdateError is UserAuthenticationRequiredException + ? const AuthenticationRequiredErrorSnackBar() + : const GenericErrorSnackBar(); ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(snackBar); - if (eventError is UserAuthenticationRequiredException) { + if (quoteUpdateError is UserAuthenticationRequiredException) { onAuthenticationError(); } } }, builder: (context, state) { - final quote = state is QuoteDetailsSuccess ? state.quote : null; - final cubit = context.read(); return WillPopScope( onWillPop: () async { - Navigator.of(context).pop(quote); + final displayedQuote = + state is QuoteDetailsSuccess ? state.quote : null; + Navigator.of(context).pop(displayedQuote); return false; }, child: Scaffold( - appBar: RowAppBar( - children: [ - if (quote != null) ...[ - FavoriteIconButton( - isFavorite: quote.isFavorite ?? false, - onTap: () { - if (quote.isFavorite == true) { - cubit.unfavoriteQuote(); - } else { - cubit.favoriteQuote(); - } - }, - ), - UpvoteIconButton( - count: quote.upvotesCount, - isUpvoted: quote.isUpvoted ?? false, - onTap: () { - if (quote.isUpvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.upvoteQuote(); - } - }, - ), - DownvoteIconButton( - count: quote.downvotesCount, - isDownvoted: quote.isDownvoted ?? false, - onTap: () { - if (quote.isDownvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.downvoteQuote(); - } - }, - ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( - url, - ), - ); - }, - ), - ] - ], - ), + appBar: state is QuoteDetailsSuccess + ? _QuoteActionsAppBar( + quote: state.quote, + shareableLinkGenerator: shareableLinkGenerator, + ) + : null, body: SafeArea( child: Padding( padding: EdgeInsets.all( - theme.screenMargin, + WonderTheme.of(context).screenMargin, ), - child: quote != null + child: state is QuoteDetailsSuccess ? _Quote( - quote: quote, + quote: state.quote, ) : state is QuoteDetailsFailure ? ExceptionIndicator( onTryAgain: () { - cubit.refresh(); + final cubit = context.read(); + cubit.refetch(); }, ) : // TODO: replace with centered circular progress indicator @@ -159,6 +117,72 @@ class QuoteDetailsView extends StatelessWidget { } } +class _QuoteActionsAppBar extends StatelessWidget + implements PreferredSizeWidget { + const _QuoteActionsAppBar({ + required this.quote, + this.shareableLinkGenerator, + Key? key, + }) : super(key: key); + + final Quote quote; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; + + @override + Widget build(BuildContext context) { + final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; + return RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: quote.isFavorite ?? false, + onTap: () { + if (quote.isFavorite == true) { + cubit.unfavoriteQuote(); + } else { + cubit.favoriteQuote(); + } + }, + ), + UpvoteIconButton( + count: quote.upvotesCount, + isUpvoted: quote.isUpvoted ?? false, + onTap: () { + if (quote.isUpvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.upvoteQuote(); + } + }, + ), + DownvoteIconButton( + count: quote.downvotesCount, + isDownvoted: quote.isDownvoted ?? false, + onTap: () { + if (quote.isDownvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.downvoteQuote(); + } + }, + ), + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( + url, + ); + }, + ), + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} + class _Quote extends StatelessWidget { static const double _quoteIconWidth = 46; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_state.dart index 229d6375..f89c5c92 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/lib/src/quote_details_state.dart @@ -2,31 +2,34 @@ part of 'quote_details_cubit.dart'; abstract class QuoteDetailsState extends Equatable { const QuoteDetailsState(); - - @override - List get props => []; } class QuoteDetailsInProgress extends QuoteDetailsState { const QuoteDetailsInProgress(); + + @override + List get props => []; } class QuoteDetailsSuccess extends QuoteDetailsState { const QuoteDetailsSuccess({ required this.quote, - this.eventError, + this.quoteUpdateError, }); final Quote quote; - final dynamic eventError; + final dynamic quoteUpdateError; @override List get props => [ quote, - eventError, + quoteUpdateError, ]; } class QuoteDetailsFailure extends QuoteDetailsState { const QuoteDetailsFailure(); + + @override + List get props => []; } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.lock deleted file mode 100644 index 551ad252..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.lock +++ /dev/null @@ -1,759 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - share_plus: - dependency: "direct main" - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.9" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.yaml index 856ced49..5f16c003 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_details/pubspec.yaml @@ -8,8 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 - share_plus: ^2.1.4 + flutter_bloc: ^8.0.1 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config.json deleted file mode 100644 index b2a0640e..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config.json +++ /dev/null @@ -1,626 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_list", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:12.803878Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config_subset deleted file mode 100644 index 9733f73a..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/package_config_subset +++ /dev/null @@ -1,413 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins-dependencies deleted file mode 100644 index 714bcf16..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:12.968541","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.packages deleted file mode 100644 index c90f8a67..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/.packages +++ /dev/null @@ -1,109 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:12.774248. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_list:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart index 22ffba03..2ccb5ec1 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:bloc_concurrency/bloc_concurrency.dart'; import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -19,23 +20,17 @@ class QuoteListBloc extends Bloc { super( const QuoteListState(), ) { - _registerEventHandler(); + _registerEventsHandler(); - add( - const QuoteListFirstPageRequested(), - ); + _authChangesSubscription = userRepository.getUser().listen( + (user) { + _authenticatedUsername = user?.username; - _authChangesSubscription = userRepository - .getUser() - .where( - (user) => user?.username != _authenticatedUsername, - ) - .listen((user) { - _authenticatedUsername = user?.username; - add( - const QuoteListUserAuthenticationChanged(), - ); - }); + add( + const QuoteListUsernameObtained(), + ); + }, + ); } late final StreamSubscription _authChangesSubscription; @@ -43,138 +38,277 @@ class QuoteListBloc extends Bloc { String? _authenticatedUsername; final QuoteRepository _quoteRepository; - void _registerEventHandler() { + void _registerEventsHandler() { on( - (event, emit) async { - if (event is QuoteListFirstPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + (event, emitter) async { + if (event is QuoteListUsernameObtained) { + await _handleQuoteListUsernameObtained(emitter); + } else if (event is QuoteListFailedFetchRetried) { + await _handleQuoteListFailedFetchRetried(emitter); } else if (event is QuoteListItemUpdated) { - emit( - state.copyWithUpdatedQuote(event.updatedQuote), - ); - } else if (event is QuoteListUserAuthenticationChanged) { - emit( - QuoteListState( - filter: state.filter, - ), - ); - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + _handleQuoteListItemUpdated(emitter, event); } else if (event is QuoteListTagChanged) { - emit( - QuoteListState.loadingNewTag(tag: event.tag), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListTagChanged(emitter, event); } else if (event is QuoteListSearchTermChanged) { - emit( - QuoteListState.loadingNewSearchTerm( - searchTerm: event.searchTerm, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListSearchTermChanged(emitter, event); } else if (event is QuoteListRefreshed) { - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - isRefresh: true, - ), - onData: emit, - ); - } else if (event is QuoteListNewPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - event.pageNumber, - fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, - ), - onData: emit, - ); + await _handleQuoteListRefreshed(emitter, event); + } else if (event is QuoteListNextPageRequested) { + await _handleQuoteListNextPageRequested(emitter, event); } else if (event is QuoteListItemFavoriteToggled) { - try { - final updatedQuote = await (event is QuoteListItemFavorited - ? _quoteRepository.favoriteQuote(event.id) - : _quoteRepository.unfavoriteQuote(event.id)); - final isFilteringByFavorites = - state.filter is QuoteListFilterByFavorites; - if (!isFilteringByFavorites) { - emit( - state.copyWithUpdatedQuote(updatedQuote), - ); - } else { - emit( - QuoteListState( - filter: state.filter, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - ), - onData: emit, - ); - } - } catch (error) { - emit( - state.copyWithFavoriteToggleError(error), - ); - } + await _handleQuoteListItemFavoriteToggled(emitter, event); } else if (event is QuoteListFilterByFavoritesToggled) { - final isFilteringByFavorites = - state.filter is! QuoteListFilterByFavorites; + await _handleQuoteListFilterByFavoritesToggled(emitter); + } + }, + transformer: (eventStream, eventHandler) { + final nonDebounceEventStream = eventStream.where( + (event) => event is! QuoteListSearchTermChanged, + ); - emit( - QuoteListState.loadingToggledFavoritesFilter( - isFilteringByFavorites: isFilteringByFavorites, - ), - ); + final debounceEventStream = eventStream + .whereType() + .debounceTime( + const Duration(seconds: 1), + ) + .where((event) { + final previousFilter = state.filter; + final previousSearchTerm = + previousFilter is QuoteListFilterBySearchTerm + ? previousFilter.searchTerm + : ''; - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: isFilteringByFavorites - ? QuoteListPageFetchPolicy.cacheAndNetwork - : QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); - } + return event.searchTerm != previousSearchTerm; + }); + + final mergedEventStream = MergeStream([ + nonDebounceEventStream, + debounceEventStream, + ]); + + final restartableTransformer = restartable(); + return restartableTransformer(mergedEventStream, eventHandler); }, - transformer: _transformEvents, + ); + } + + Future _handleQuoteListFailedFetchRetried(Emitter emitter) { + // Clears out the error and puts the loading indicator back on the screen. + emitter( + state.copyWithNewError(null), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + void _handleQuoteListItemUpdated( + Emitter emitter, + QuoteListItemUpdated event, + ) { + // Replaces the updated quote in the current state and re-emits it. + emitter( + state.copyWithUpdatedQuote( + event.updatedQuote, + ), + ); + } + + Future _handleQuoteListUsernameObtained(Emitter emitter) { + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListTagChanged( + Emitter emitter, + QuoteListTagChanged event, + ) { + emitter( + QuoteListState.loadingNewTag(tag: event.tag), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *deselecting* a tag, the `cachePreferably` fetch policy + // will return you the cached quotes. If the user is selecting a new tag + // instead, the `cachePreferably` fetch policy won't find any cached + // quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListSearchTermChanged( + Emitter emitter, + QuoteListSearchTermChanged event, + ) { + emitter( + QuoteListState.loadingNewSearchTerm( + searchTerm: event.searchTerm, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *clearing out* the search bar, the `cachePreferably` + // fetch policy will return you the cached quotes. If the user is + // entering a new search instead, the `cachePreferably` fetch policy + // won't find any cached quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListRefreshed( + Emitter emitter, + QuoteListRefreshed event, + ) { + final firstPageFetchStream = _fetchQuotePage( + 1, + // Since the user is asking for a refresh, you don't want to get cached + // quotes, thus the `networkOnly` fetch policy makes the most sense. + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + isRefresh: true, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListNextPageRequested( + Emitter emitter, + QuoteListNextPageRequested event, + ) { + emitter( + state.copyWithNewError(null), + ); + + final nextPageFetchStream = _fetchQuotePage( + event.pageNumber, + // The `networkPreferably` fetch policy prioritizes fetching the new page + // from the server, and, if it fails, try grabbing it from the cache. + fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, + ); + + return emitter.onEach( + nextPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListItemFavoriteToggled( + Emitter emitter, + QuoteListItemFavoriteToggled event, + ) async { + try { + // The `favoriteQuote()` and `unfavoriteQuote()` functions return you the + // updated quote object. + final updatedQuote = await (event is QuoteListItemFavorited + ? _quoteRepository.favoriteQuote( + event.id, + ) + : _quoteRepository.unfavoriteQuote( + event.id, + )); + final isFilteringByFavorites = state.filter is QuoteListFilterByFavorites; + + // If the user isn't filtering by favorites, you just replace the changed + // quote on-screen. + if (!isFilteringByFavorites) { + emitter( + state.copyWithUpdatedQuote( + updatedQuote, + ), + ); + } else { + // If the user *is* filtering by favorites, that means the user is + // actually *removing* a quote from the list, so you refresh the entire + // list to make sure you won't break the pagination. + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + ); + + await emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + } catch (error) { + // If an error happens trying to (un)favorite a quote you attach an error + // to the current state which will result on the screen showing a snackbar + // to the user and possibly taking him to the Sign In screen in case the + // cause is the user being signed out. + emitter( + state.copyWithFavoriteToggleError( + error, + ), + ); + } + } + + Future _handleQuoteListFilterByFavoritesToggled( + Emitter emitter, + ) { + final isFilteringByFavorites = state.filter is! QuoteListFilterByFavorites; + + emitter( + QuoteListState.loadingToggledFavoritesFilter( + isFilteringByFavorites: isFilteringByFavorites, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *adding* the favorites filter, you use the *cacheAndNetwork* + // fetch policy to show the cached data first followed by the updated list + // from the server. + // If the user is *removing* the favorites filter, you simply show the + // cached data they were seeing before applying the filter. + fetchPolicy: isFilteringByFavorites + ? QuoteListPageFetchPolicy.cacheAndNetwork + : QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, ); } @@ -183,83 +317,65 @@ class QuoteListBloc extends Bloc { required QuoteListPageFetchPolicy fetchPolicy, bool isRefresh = false, }) async* { - final filter = state.filter; - final isFilteringByFavorites = filter is QuoteListFilterByFavorites; - if (isFilteringByFavorites && _authenticatedUsername == null) { + final currentlyAppliedFilter = state.filter; + final isFilteringByFavorites = + currentlyAppliedFilter is QuoteListFilterByFavorites; + final isUserSignedIn = _authenticatedUsername != null; + if (isFilteringByFavorites && !isUserSignedIn) { yield QuoteListState.noItemsFound( - filter: state.filter, + filter: currentlyAppliedFilter, ); } else { - yield* _quoteRepository - .getQuoteListPage( + final pagesStream = _quoteRepository.getQuoteListPage( page, - tag: filter is QuoteListFilterByTag ? filter.tag : null, - searchTerm: - filter is QuoteListFilterBySearchTerm ? filter.searchTerm : '', - favoritedByUsername: filter is QuoteListFilterByFavorites - ? _authenticatedUsername + tag: currentlyAppliedFilter is QuoteListFilterByTag + ? currentlyAppliedFilter.tag : null, + searchTerm: currentlyAppliedFilter is QuoteListFilterBySearchTerm + ? currentlyAppliedFilter.searchTerm + : '', + favoritedByUsername: + currentlyAppliedFilter is QuoteListFilterByFavorites + ? _authenticatedUsername + : null, fetchPolicy: fetchPolicy, - ) - .map( - (newPage) { - return newPage.toQuoteListState( - page, - state, - isRefresh: page != state.nextPage, - ); - }, - ).onErrorReturnWith( - (error, _) { - if (error is EmptySearchResultException) { - return QuoteListState.noItemsFound( - filter: state.filter, - ); - } - - if (isRefresh) { - return state.copyWithNewRefreshError( - error, - ); - } else { - return state.copyWithNewError( - error, - ); - } - }, ); - } - } - Stream _transformEvents( - Stream events, - EventMapper mapper, - ) { - final nonDebounceEventStream = events.where( - (event) => event is! QuoteListSearchTermChanged, - ); + try { + await for (final newPage in pagesStream) { + final newItemList = newPage.quoteList; + final oldItemList = state.itemList ?? []; + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); + + final nextPage = newPage.isLastPage ? null : page + 1; + + yield QuoteListState.success( + nextPage: nextPage, + itemList: completeItemList, + filter: currentlyAppliedFilter, + isRefresh: isRefresh, + ); + } + } catch (error) { + if (error is EmptySearchResultException) { + yield QuoteListState.noItemsFound( + filter: currentlyAppliedFilter, + ); + } - final debounceEventStream = events - .whereType() - .debounceTime( - const Duration(seconds: 1), - ) - .where((event) { - final previousFilter = state.filter; - final previousSearchTerm = previousFilter is QuoteListFilterBySearchTerm - ? previousFilter.searchTerm - : ''; - - return event.searchTerm != previousSearchTerm; - }); - - final mergedEventStream = MergeStream([ - nonDebounceEventStream, - debounceEventStream, - ]); - - // Explanation: https://stackoverflow.com/questions/61569917/how-do-i-nest-streams-in-dart-map-streams-to-stream-events - return mergedEventStream.switchMap(mapper); + if (isRefresh) { + yield state.copyWithNewRefreshError( + error, + ); + } else { + yield state.copyWithNewError( + error, + ); + } + } + } } @override @@ -268,23 +384,3 @@ class QuoteListBloc extends Bloc { return super.close(); } } - -extension on QuoteListPage { - QuoteListState toQuoteListState( - int page, - QuoteListState lastState, { - bool isRefresh = false, - }) { - final newItemList = quoteList; - final nextPage = isLastPage ? null : page + 1; - - final oldItemList = lastState.itemList ?? []; - - return QuoteListState.success( - nextPage: nextPage, - itemList: isRefresh ? newItemList : [...oldItemList, ...newItemList], - filter: lastState.filter, - isRefresh: isRefresh, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_event.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_event.dart index 963317fe..f7b7701f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_event.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_event.dart @@ -7,18 +7,10 @@ abstract class QuoteListEvent extends Equatable { List get props => []; } -class QuoteListFirstPageRequested extends QuoteListEvent { - const QuoteListFirstPageRequested(); -} - class QuoteListFilterByFavoritesToggled extends QuoteListEvent { const QuoteListFilterByFavoritesToggled(); } -class QuoteListUserAuthenticationChanged extends QuoteListEvent { - const QuoteListUserAuthenticationChanged(); -} - class QuoteListTagChanged extends QuoteListEvent { const QuoteListTagChanged( this.tag, @@ -49,8 +41,8 @@ class QuoteListRefreshed extends QuoteListEvent { const QuoteListRefreshed(); } -class QuoteListNewPageRequested extends QuoteListEvent { - const QuoteListNewPageRequested({ +class QuoteListNextPageRequested extends QuoteListEvent { + const QuoteListNextPageRequested({ required this.pageNumber, }); @@ -58,11 +50,33 @@ class QuoteListNewPageRequested extends QuoteListEvent { } abstract class QuoteListItemFavoriteToggled extends QuoteListEvent { - const QuoteListItemFavoriteToggled(this.id); + const QuoteListItemFavoriteToggled( + this.id, + ); final int id; } +class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemFavorited( + int id, + ) : super(id); +} + +class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemUnfavorited( + int id, + ) : super(id); +} + +class QuoteListFailedFetchRetried extends QuoteListEvent { + const QuoteListFailedFetchRetried(); +} + +class QuoteListUsernameObtained extends QuoteListEvent { + const QuoteListUsernameObtained(); +} + class QuoteListItemUpdated extends QuoteListEvent { const QuoteListItemUpdated( this.updatedQuote, @@ -70,11 +84,3 @@ class QuoteListItemUpdated extends QuoteListEvent { final Quote updatedQuote; } - -class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemFavorited(int id) : super(id); -} - -class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemUnfavorited(int id) : super(id); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 4ed8d79b..0d4e77a5 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -3,10 +3,12 @@ import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -17,12 +19,14 @@ class QuoteListScreen extends StatelessWidget { required this.quoteRepository, required this.userRepository, required this.onAuthenticationError, + required this.remoteValueService, this.onQuoteSelected, Key? key, }) : super(key: key); final QuoteRepository quoteRepository; final UserRepository userRepository; + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -36,6 +40,7 @@ class QuoteListScreen extends StatelessWidget { child: QuoteListView( onAuthenticationError: onAuthenticationError, onQuoteSelected: onQuoteSelected, + remoteValueService: remoteValueService, ), ); } @@ -44,11 +49,13 @@ class QuoteListScreen extends StatelessWidget { @visibleForTesting class QuoteListView extends StatefulWidget { const QuoteListView({ + required this.remoteValueService, required this.onAuthenticationError, this.onQuoteSelected, Key? key, }) : super(key: key); + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -57,20 +64,22 @@ class QuoteListView extends StatefulWidget { } class _QuoteListViewState extends State { + // For a deep dive on PagingController refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter final PagingController _pagingController = PagingController( firstPageKey: 1, ); final TextEditingController _searchBarController = TextEditingController(); + QuoteListBloc get _bloc => context.read(); + @override void initState() { _pagingController.addPageRequestListener((pageNumber) { final isSubsequentPage = pageNumber > 1; if (isSubsequentPage) { - final bloc = context.read(); - bloc.add( - QuoteListNewPageRequested( + _bloc.add( + QuoteListNextPageRequested( pageNumber: pageNumber, ), ); @@ -78,8 +87,7 @@ class _QuoteListViewState extends State { }); _searchBarController.addListener(() { - final bloc = context.read(); - bloc.add( + _bloc.add( QuoteListSearchTermChanged( _searchBarController.text, ), @@ -130,37 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - final bloc = context.read(); - bloc.add( - const QuoteListRefreshed(), - ); - - final stateChangeFuture = bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), ), - ], - ), + ), + ], ), ), ), diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_state.dart index e8aa3e3b..b2a4a868 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_list_state.dart @@ -1,5 +1,24 @@ part of 'quote_list_bloc.dart'; +/// Holds all data needed to infer the state of the paginated grid of quotes. +/// +/// You don't have to memorize what combination of properties lead to which +/// visual outputs, the [infinite_scroll_pagination](https://github.com/EdsonBueno/infinite_scroll_pagination) +/// package takes care of that. Simply provide the values as you have them and +/// everything will work. +/// +/// For example: +/// 1. If both [itemList] and [error] aren't null, that is, if you have +/// both some quotes and an error at the same time, that means the error occurred +/// trying to fetch a *subsequent* page, therefore, the error indicator should +/// be appended to the bottom of the grid instead of taking the whole screen. +/// 2. If [error] isn't null but [itemList] is, that +/// means the error occurred trying to fetch the *first* page, in which case you +/// want to display the full-screen error indicator since you don't have any +/// quotes to show. +/// 3. If there's no [error], [itemList] has some items and [nextPage] isn't null, +/// that means you haven't fetched all pages yet and therefore a loading indicator +/// should be appended to the bottom of the grid. class QuoteListState extends Equatable { const QuoteListState({ this.itemList, @@ -8,80 +27,113 @@ class QuoteListState extends Equatable { this.filter, this.refreshError, this.favoriteToggleError, - DateTime? fetchTimestamp, - }) : _fetchTimestamp = fetchTimestamp; + }); + /// Holds all of the items from the pages you have loaded so far. final List? itemList; + + /// The next page to be fetched, or `null` if you have already loaded the entire list. + /// + /// Besides determining which page should be asked next, it also determines + /// whether you need a loading indicator at the bottom to indicate you haven't + /// fetched all pages yet. final int? nextPage; + + /// Indicates an error occurred trying to fetch any page of quotes. + /// + /// If both this property and [itemList] holds values, that means the error + /// occurred trying to fetch a subsequent page. If, on the other hand, this + /// property has a value but [itemList] doesn't, that means the error occurred + /// when fetching the first page. final dynamic error; + + /// The currently applied filter (if any). + /// + /// Can be either a tag filter (`QuoteListFilterByTag`), a search filter (`QuoteListFilterBySearchTerm`), + /// or a favorites-only one (`QuoteListFilterByFavorites`). final QuoteListFilter? filter; - final DateTime? _fetchTimestamp; + + /// Indicates an error occurred trying to refresh the list. + /// + /// Used to display a snackbar to indicate the failure. final dynamic refreshError; + + /// Indicates an error occurred trying to favorite a quote. + /// + /// Used to display a snackbar to the user indicating the failure and also + /// redirect them to the Sign In screen in case the cause of the error is the + /// user being signed out. final dynamic favoriteToggleError; - factory QuoteListState.loadingNewTag({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a tag change. + QuoteListState.loadingNewTag({ required Tag? tag, - }) { - return QuoteListState( - filter: tag != null ? QuoteListFilterByTag(tag) : null, - ); - } + }) : this( + filter: tag != null ? QuoteListFilterByTag(tag) : null, + ); - factory QuoteListState.loadingNewSearchTerm({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a search change. + QuoteListState.loadingNewSearchTerm({ required String searchTerm, - }) { - return QuoteListState( - filter: searchTerm.isEmpty - ? null - : QuoteListFilterBySearchTerm( - searchTerm, - ), - ); - } - - factory QuoteListState.loadingToggledFavoritesFilter({ + }) : this( + filter: searchTerm.isEmpty + ? null + : QuoteListFilterBySearchTerm( + searchTerm, + ), + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a change in the favorites-only toggle. + const QuoteListState.loadingToggledFavoritesFilter({ required bool isFilteringByFavorites, - }) { - return QuoteListState( - filter: - isFilteringByFavorites ? const QuoteListFilterByFavorites() : null, - ); - } - - factory QuoteListState.noItemsFound({ + }) : this( + filter: isFilteringByFavorites + ? const QuoteListFilterByFavorites() + : null, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// couldn't find any items for the selected filter. + const QuoteListState.noItemsFound({ required QuoteListFilter? filter, - }) { - return QuoteListState( - itemList: const [], - error: null, - nextPage: 1, - filter: filter, - ); - } - - factory QuoteListState.success({ + }) : this( + itemList: const [], + error: null, + nextPage: 1, + filter: filter, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// has successfully loaded a new page. + const QuoteListState.success({ required int? nextPage, required List itemList, required QuoteListFilter? filter, required bool isRefresh, - }) { - return QuoteListState( - nextPage: nextPage, - itemList: itemList, - filter: filter, - fetchTimestamp: isRefresh ? DateTime.now() : null, - ); - } - - QuoteListState copyWithNewError(dynamic error) => QuoteListState( + }) : this( + nextPage: nextPage, + itemList: itemList, + filter: filter, + ); + + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [error] property. + QuoteListState copyWithNewError( + dynamic error, + ) => + QuoteListState( itemList: itemList, nextPage: nextPage, error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, ); + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [refreshError] property. QuoteListState copyWithNewRefreshError( dynamic refreshError, ) => @@ -91,10 +143,11 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); + /// Auxiliary function that creates a copy of the current state by replacing + /// just the [updatedQuote]. QuoteListState copyWithUpdatedQuote( Quote updatedQuote, ) { @@ -110,11 +163,12 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); } + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [favoriteToggleError] property. QuoteListState copyWithFavoriteToggleError( dynamic favoriteToggleError, ) => @@ -124,7 +178,6 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: favoriteToggleError, ); @@ -134,7 +187,6 @@ class QuoteListState extends Equatable { nextPage, error, filter, - _fetchTimestamp, refreshError, favoriteToggleError, ]; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 83% rename from 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index 8bc9e2c3..5fe4581d 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,14 @@ class QuoteSliverGrid extends StatelessWidget { Widget build(BuildContext context) { final theme = WonderTheme.of(context); final onQuoteSelected = this.onQuoteSelected; - return SliverPadding( + final bloc = context.read(); + + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedStaggeredSliverGrid.count( + // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -38,7 +41,6 @@ class QuoteSliverGrid extends StatelessWidget { top: const OpeningQuoteSvgAsset(), bottom: const ClosingQuoteSvgAsset(), onFavorite: () { - final bloc = context.read(); bloc.add( isFavorite ? QuoteListItemUnfavorited(quote.id) @@ -48,9 +50,9 @@ class QuoteSliverGrid extends StatelessWidget { onTap: onQuoteSelected != null ? () async { final updatedQuote = await onQuoteSelected(quote.id); + if (updatedQuote != null && updatedQuote.isFavorite != quote.isFavorite) { - final bloc = context.read(); bloc.add( QuoteListItemUpdated( updatedQuote, @@ -64,9 +66,8 @@ class QuoteSliverGrid extends StatelessWidget { firstPageErrorIndicatorBuilder: (context) { return ExceptionIndicator( onTryAgain: () { - final bloc = context.read(); bloc.add( - const QuoteListFirstPageRequested(), + const QuoteListFailedFetchRetried(), ); }, ); @@ -75,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart new file mode 100644 index 00000000..be337863 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -0,0 +1,77 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + child: PagedListView.separated( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + separatorBuilder: (context, index) => + SizedBox(height: theme.gridSpacing)), + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.lock deleted file mode 100644 index 655120cd..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.lock +++ /dev/null @@ -1,714 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: "direct main" - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.yaml index 3fa692f9..7eef55f0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/quote_list/pubspec.yaml @@ -8,7 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 + bloc_concurrency: ^0.2.0 flutter: sdk: flutter domain_models: @@ -17,11 +18,10 @@ dependencies: path: ../../quote_repository user_repository: path: ../../user_repository - infinite_scroll_pagination: - git: - url: git://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: feature/staggered-grid - rxdart: ^0.27.1 + monitoring: + path: ../../monitoring + infinite_scroll_pagination: ^4.0.0-dev.1 + rxdart: ^0.27.3 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config.json deleted file mode 100644 index 8fdb9922..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:16.164756Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config_subset deleted file mode 100644 index 8736065f..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins-dependencies deleted file mode 100644 index 27c5fe42..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:16.317065","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.packages deleted file mode 100644 index 6444c0f5..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:16.139796. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_in:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_cubit.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_cubit.dart index 5db3fc78..fe0f041a 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_cubit.dart @@ -1,3 +1,4 @@ +import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:form_fields/form_fields.dart'; @@ -15,76 +16,88 @@ class SignInCubit extends Cubit { final UserRepository userRepository; void onEmailChanged(String newValue) { - final previousValue = state.email; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - email: shouldValidate - ? Email.dirty( - newValue, - ) - : Email.pure( - newValue, - ), - error: null, + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final shouldValidate = previousEmailState.invalid; + final newEmailState = shouldValidate + ? Email.validated( + newValue, + ) + : Email.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + email: newEmailState, ); - emit(newState); + emit(newScreenState); } - void onPasswordChanged(String newValue) { - final previousValue = state.password; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, - ); + void onEmailUnfocused() { + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final previousEmailValue = previousEmailState.value; - emit(newState); + final newEmailState = Email.validated( + previousEmailValue, + ); + final newScreenState = previousScreenState.copyWith( + email: newEmailState, + ); + emit(newScreenState); } - void onEmailUnfocused() { - final newState = state.copyWith( - email: Email.dirty( - state.email.value, - ), - error: null, + void onPasswordChanged(String newValue) { + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final shouldValidate = previousPasswordState.invalid; + final newPasswordState = shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + password: newPasswordState, ); - emit(newState); + emit(newScreenState); } void onPasswordUnfocused() { - final newState = state.copyWith( - password: Password.dirty( - state.password.value, - ), - error: null, - ); + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final previousPasswordValue = previousPasswordState.value; - emit(newState); + final newPasswordState = Password.validated( + previousPasswordValue, + ); + final newScreenState = previousScreenState.copyWith( + password: newPasswordState, + ); + emit(newScreenState); } void onSubmit() async { - final email = Email.dirty(state.email.value); - final password = Password.dirty(state.password.value); + final email = Email.validated(state.email.value); + final password = Password.validated(state.password.value); + final isFormValid = Formz.validate([ - email, - password, - ]) == - FormzStatus.valid; + email, + password, + ]).isValid; + final newState = state.copyWith( email: email, password: password, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signIn( @@ -92,14 +105,14 @@ class SignInCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error, - status: FormzStatus.submissionFailure, + submissionStatus: error is InvalidCredentialsException + ? SubmissionStatus.invalidCredentialsError + : SubmissionStatus.genericError, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_screen.dart index 51ae1d7a..82ce0da0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_screen.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -38,7 +37,7 @@ class SignInScreen extends StatelessWidget { } @visibleForTesting -class SignInView extends StatefulWidget { +class SignInView extends StatelessWidget { const SignInView({ required this.onSignInSuccess, this.onSignUpTap, @@ -51,10 +50,53 @@ class SignInView extends StatefulWidget { final VoidCallback onSignInSuccess; @override - _SignInViewState createState() => _SignInViewState(); + Widget build(BuildContext context) { + final l10n = SignInLocalizations.of(context); + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + l10n.appBarTitle, + ), + ), + body: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric( + horizontal: Spacing.mediumLarge, + ), + child: _SignInForm( + onSignUpTap: onSignUpTap, + onForgotMyPasswordTap: onForgotMyPasswordTap, + onSignInSuccess: onSignInSuccess, + ), + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignInForm extends StatefulWidget { + const _SignInForm({ + required this.onSignInSuccess, + this.onSignUpTap, + this.onForgotMyPasswordTap, + Key? key, + }) : super(key: key); + + final VoidCallback? onSignUpTap; + final VoidCallback? onForgotMyPasswordTap; + final VoidCallback onSignInSuccess; + + @override + State<_SignInForm> createState() => _SignInFormState(); } -class _SignInViewState extends State { +class _SignInFormState extends State<_SignInForm> { final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -74,22 +116,34 @@ class _SignInViewState extends State { }); } + @override + void dispose() { + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { final l10n = SignInLocalizations.of(context); - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignInSuccess(); return; } - final error = state.error; - if (error != null) { + final hasSubmissionError = state.submissionStatus == + SubmissionStatus.genericError || + state.submissionStatus == SubmissionStatus.invalidCredentialsError; + + if (hasSubmissionError) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( - error is InvalidCredentialsException + state.submissionStatus == SubmissionStatus.invalidCredentialsError ? SnackBar( content: Text( l10n.invalidCredentialsErrorMessage, @@ -99,75 +153,21 @@ class _SignInViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - l10n.appBarTitle, - ), - ), - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.mediumLarge, - ), - child: _SignInForm( - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - onSignUpTap: widget.onSignUpTap, - onForgotMyPasswordTap: widget.onForgotMyPasswordTap, - ), - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); - - @override - void dispose() { - _emailFocusNode.dispose(); - _passwordFocusNode.dispose(); - super.dispose(); - } -} - -class _SignInForm extends StatelessWidget { - const _SignInForm({ - required this.emailFocusNode, - required this.passwordFocusNode, - this.onSignUpTap, - this.onForgotMyPasswordTap, - Key? key, - }) : super(key: key); - - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - - @override - Widget build(BuildContext context) { - final l10n = SignInLocalizations.of(context); - return BlocBuilder( builder: (context, state) { final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final cubit = context.read(); return Column( children: [ TextField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -185,7 +185,7 @@ class _SignInForm extends StatelessWidget { height: Spacing.large, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, obscureText: true, onEditingComplete: cubit.onSubmit, @@ -206,7 +206,8 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.forgotMyPasswordButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onForgotMyPasswordTap, + onPressed: + isSubmissionInProgress ? null : widget.onForgotMyPasswordTap, ), const SizedBox( height: Spacing.small, @@ -232,7 +233,7 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.signUpButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onSignUpTap, + onPressed: isSubmissionInProgress ? null : widget.onSignUpTap, ), ], ); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_state.dart index 226fb0b8..05f6065f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/lib/src/sign_in_state.dart @@ -2,28 +2,24 @@ part of 'sign_in_cubit.dart'; class SignInState extends Equatable { const SignInState({ - this.email = const Email.pure(), - this.password = const Password.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.password = const Password.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; final Password password; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignInState copyWith({ Email? email, Password? password, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignInState( email: email ?? this.email, password: password ?? this.password, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @@ -31,7 +27,23 @@ class SignInState extends Equatable { List get props => [ email, password, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + /// Used when the form has not been sent yet. + idle, + + /// Used to disable all buttons and add a progress indicator to the main one. + inProgress, + + /// Used to close the screen and navigate back to the caller screen. + success, + + /// Used to display a generic snack bar saying that an error has occurred, e.g., no internet connection. + genericError, + + /// Used to show a more specific error telling the user they got the email and/or password wrong. + invalidCredentialsError, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.yaml index 77b2b521..9f15389f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config.json deleted file mode 100644 index 2eb4d6cc..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_up", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:19.373943Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config_subset deleted file mode 100644 index de59b4d4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins-dependencies deleted file mode 100644 index 34946501..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:19.545106","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.packages deleted file mode 100644 index e2dd4560..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:19.347022. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_up:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_cubit.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_cubit.dart index 767d87b0..1c5749c0 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_cubit.dart @@ -15,97 +15,75 @@ class SignUpCubit extends Cubit { final UserRepository userRepository; - void onUsernameChanged(String newValue) { - final previousUsername = state.username; - final shouldValidate = previousUsername.invalid; - final newState = state.copyWith( - username: shouldValidate - ? Username.dirty( - newValue, - isAlreadyRegistered: newValue == previousUsername.value - ? previousUsername.isAlreadyRegistered - : false, - ) - : Username.pure( - newValue, - ), - error: null, - ); - emit(newState); - } - void onEmailChanged(String newValue) { final previousEmail = state.email; final shouldValidate = previousEmail.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousEmail.value ? previousEmail.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } - void onPasswordChanged(String newValue) { - final previousPassword = state.password; - final shouldValidate = previousPassword.invalid; + void onEmailUnfocused() { final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, + email: Email.validated( + state.email.value, + isAlreadyRegistered: state.email.isAlreadyRegistered, + ), ); emit(newState); } - void onPasswordConfirmationChanged(String newValue) { - final previousPasswordConfirmation = state.passwordConfirmation; - final shouldValidate = previousPasswordConfirmation.invalid; + void onUsernameChanged(String newValue) { + final previousUsername = state.username; + final shouldValidate = previousUsername.invalid; final newState = state.copyWith( - passwordConfirmation: shouldValidate - ? PasswordConfirmation.dirty( + username: shouldValidate + ? Username.validated( newValue, - password: state.password, + isAlreadyRegistered: newValue == previousUsername.value + ? previousUsername.isAlreadyRegistered + : false, ) - : PasswordConfirmation.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); } void onUsernameUnfocused() { final newState = state.copyWith( - username: Username.dirty( + username: Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } - void onEmailUnfocused() { + void onPasswordChanged(String newValue) { + final previousPassword = state.password; + final shouldValidate = previousPassword.invalid; final newState = state.copyWith( - email: Email.dirty( - state.email.value, - isAlreadyRegistered: state.email.isAlreadyRegistered, - ), - error: null, + password: shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ), ); emit(newState); @@ -113,41 +91,59 @@ class SignUpCubit extends Cubit { void onPasswordUnfocused() { final newState = state.copyWith( - password: Password.dirty( + password: Password.validated( state.password.value, ), - error: null, + ); + emit(newState); + } + + void onPasswordConfirmationChanged(String newValue) { + final previousPasswordConfirmation = state.passwordConfirmation; + final shouldValidate = previousPasswordConfirmation.invalid; + final newState = state.copyWith( + passwordConfirmation: shouldValidate + ? PasswordConfirmation.validated( + newValue, + password: state.password, + ) + : PasswordConfirmation.unvalidated( + newValue, + ), ); emit(newState); } void onPasswordConfirmationUnfocused() { final newState = state.copyWith( - passwordConfirmation: PasswordConfirmation.dirty( + passwordConfirmation: PasswordConfirmation.validated( state.passwordConfirmation.value, password: state.password, ), - error: null, ); emit(newState); } void onSubmit() async { - final username = Username.dirty( + final username = Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ); - final email = Email.dirty( + + final email = Email.validated( state.email.value, isAlreadyRegistered: state.email.isAlreadyRegistered, ); - final password = Password.dirty( + + final password = Password.validated( state.password.value, ); - final passwordConfirmation = PasswordConfirmation.dirty( + + final passwordConfirmation = PasswordConfirmation.validated( state.passwordConfirmation.value, password: password, ); + final isFormValid = Formz.validate([ username, email, @@ -155,15 +151,17 @@ class SignUpCubit extends Cubit { passwordConfirmation, ]) == FormzStatus.valid; + final newState = state.copyWith( username: username, email: email, password: password, passwordConfirmation: passwordConfirmation, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signUp( @@ -172,29 +170,27 @@ class SignUpCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) - : null, + : state.username, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) - : null, + : state.email, ); emit(newState); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_screen.dart index ded26ec0..00cc6d8f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_screen.dart @@ -31,7 +31,7 @@ class SignUpScreen extends StatelessWidget { } @visibleForTesting -class SignUpView extends StatefulWidget { +class SignUpView extends StatelessWidget { const SignUpView({ required this.onSignUpSuccess, Key? key, @@ -40,10 +40,46 @@ class SignUpView extends StatefulWidget { final VoidCallback onSignUpSuccess; @override - _SignUpViewState createState() => _SignUpViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + SignUpLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _SignUpForm( + onSignUpSuccess: onSignUpSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignUpForm extends StatefulWidget { + const _SignUpForm({ + required this.onSignUpSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onSignUpSuccess; + + @override + State<_SignUpForm> createState() => _SignUpFormState(); } -class _SignUpViewState extends State { +class _SignUpFormState extends State<_SignUpForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -52,24 +88,40 @@ class _SignUpViewState extends State { @override void initState() { super.initState(); - _usernameFocusNode.addListener(() { - if (!_usernameFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onUsernameUnfocused(); - } - }); + _setUpEmailFieldFocusListener(); + _setUpUsernameFieldFocusListener(); + _setUpPasswordFieldFocusListener(); + _setUpPasswordConfirmationFieldFocusListener(); + } + + void _setUpEmailFieldFocusListener() { _emailFocusNode.addListener(() { if (!_emailFocusNode.hasFocus) { final cubit = context.read(); cubit.onEmailUnfocused(); } }); + } + + void _setUpUsernameFieldFocusListener() { + _usernameFocusNode.addListener(() { + if (!_usernameFocusNode.hasFocus) { + final cubit = context.read(); + cubit.onUsernameUnfocused(); + } + }); + } + + void _setUpPasswordFieldFocusListener() { _passwordFocusNode.addListener(() { if (!_passwordFocusNode.hasFocus) { final cubit = context.read(); cubit.onPasswordUnfocused(); } }); + } + + void _setUpPasswordConfirmationFieldFocusListener() { _passwordConfirmationFocusNode.addListener(() { if (!_passwordConfirmationFocusNode.hasFocus) { final cubit = context.read(); @@ -80,14 +132,16 @@ class _SignUpViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignUpSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -95,114 +149,69 @@ class _SignUpViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - SignUpLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _SignUpForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _SignUpForm extends StatelessWidget { - const _SignUpForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = SignUpLocalizations.of(context); final cubit = context.read(); + final emailError = state.email.invalid ? state.email.error : null; final usernameError = state.username.invalid ? state.username.error : null; - final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final passwordConfirmationError = state.passwordConfirmation.invalid ? state.passwordConfirmation.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; return Column( children: [ TextField( - focusNode: usernameFocusNode, - onChanged: cubit.onUsernameChanged, + focusNode: _emailFocusNode, + onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.person, + Icons.alternate_email, ), enabled: !isSubmissionInProgress, - labelText: l10n.usernameTextFieldLabel, - errorText: usernameError == null + labelText: l10n.emailTextFieldLabel, + errorText: emailError == null ? null - : (usernameError == UsernameValidationError.empty - ? l10n.usernameTextFieldEmptyErrorMessage - : (usernameError == UsernameValidationError.alreadyTaken - ? l10n.usernameTextFieldAlreadyTakenErrorMessage - : l10n.usernameTextFieldInvalidErrorMessage)), + : (emailError == EmailValidationError.empty + ? l10n.emailTextFieldEmptyErrorMessage + : (emailError == EmailValidationError.alreadyRegistered + ? l10n.emailTextFieldAlreadyRegisteredErrorMessage + : l10n.emailTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: emailFocusNode, - onChanged: cubit.onEmailChanged, + focusNode: _usernameFocusNode, + onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.alternate_email, + Icons.person, ), enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null + labelText: l10n.usernameTextFieldLabel, + errorText: usernameError == null ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : (emailError == EmailValidationError.alreadyRegistered - ? l10n.emailTextFieldAlreadyRegisteredErrorMessage - : l10n.emailTextFieldInvalidErrorMessage)), + : (usernameError == UsernameValidationError.empty + ? l10n.usernameTextFieldEmptyErrorMessage + : (usernameError == UsernameValidationError.alreadyTaken + ? l10n.usernameTextFieldAlreadyTakenErrorMessage + : l10n.usernameTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -223,7 +232,7 @@ class _SignUpForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -261,4 +270,13 @@ class _SignUpForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _emailFocusNode.dispose(); + _usernameFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_state.dart index e88ae868..4da10fc1 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/lib/src/sign_up_state.dart @@ -2,46 +2,48 @@ part of 'sign_up_cubit.dart'; class SignUpState extends Equatable { const SignUpState({ - this.username = const Username.pure(), - this.email = const Email.pure(), - this.password = const Password.pure(), - this.passwordConfirmation = const PasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.username = const Username.unvalidated(), + this.password = const Password.unvalidated(), + this.passwordConfirmation = const PasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final Password password; final PasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignUpState copyWith({ - Username? username, Email? email, + Username? username, Password? password, PasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignUpState( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.yaml index 34e25d43..bf170f01 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/sign_up/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config.json deleted file mode 100644 index 47032b3c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:22.661023Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config_subset deleted file mode 100644 index a3a3d7db..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins-dependencies deleted file mode 100644 index 30363430..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:22.824540","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.packages deleted file mode 100644 index 07959e1f..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:22.635817. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -update_profile:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_en.arb index 6144c43b..c66d0109 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_en.arb @@ -9,8 +9,8 @@ "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", "emailTextFieldInvalidErrorMessage": "This email is not valid.", "emailTextFieldAlreadyRegisteredErrorMessage": "This email is already registered.", - "passwordTextFieldLabel": "Password", + "passwordTextFieldLabel": "New Password", "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "passwordConfirmationTextFieldLabel": "Password Confirmation", + "passwordConfirmationTextFieldLabel": "New Password Confirmation", "passwordConfirmationTextFieldInvalidErrorMessage": "Your passwords don't match." } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_cubit.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_cubit.dart index cdd5d084..3fedabee 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_cubit.dart @@ -23,16 +23,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( username: shouldValidate - ? Username.dirty( + ? Username.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Username.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); @@ -44,16 +43,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -64,13 +62,12 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid && newValue.isNotEmpty; final newState = currentState.copyWith( password: shouldValidate - ? OptionalPassword.dirty( + ? OptionalPassword.validated( newValue, ) - : OptionalPassword.pure( + : OptionalPassword.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -81,14 +78,13 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( passwordConfirmation: shouldValidate - ? OptionalPasswordConfirmation.dirty( + ? OptionalPasswordConfirmation.validated( newValue, password: currentState.password, ) - : OptionalPasswordConfirmation.pure( + : OptionalPasswordConfirmation.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -96,11 +92,10 @@ class UpdateProfileCubit extends Cubit { void onUsernameUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - username: Username.dirty( + username: Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -108,11 +103,10 @@ class UpdateProfileCubit extends Cubit { void onEmailUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - email: Email.dirty( + email: Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -120,41 +114,39 @@ class UpdateProfileCubit extends Cubit { void onPasswordUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - password: OptionalPassword.dirty( + password: OptionalPassword.validated( currentState.password.value, ), - error: null, ); emit(newState); } void onPasswordConfirmationUnfocused() { final currentState = state as UpdateProfileLoaded; - final confirmation = OptionalPasswordConfirmation.dirty( + final confirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: currentState.password, ); final newState = currentState.copyWith( passwordConfirmation: confirmation, - error: null, ); emit(newState); } void onSubmit() async { final currentState = state as UpdateProfileLoaded; - final username = Username.dirty( + final username = Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ); - final email = Email.dirty( + final email = Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ); - final password = OptionalPassword.dirty( + final password = OptionalPassword.validated( currentState.password.value, ); - final passwordConfirmation = OptionalPasswordConfirmation.dirty( + final passwordConfirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: password, ); @@ -170,9 +162,7 @@ class UpdateProfileCubit extends Cubit { email: email, password: password, passwordConfirmation: passwordConfirmation, - status: - isFormValid ? FormzStatus.submissionInProgress : currentState.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); emit(newState); @@ -184,25 +174,23 @@ class UpdateProfileCubit extends Cubit { password.value, ); final newState = currentState.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = currentState.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) : null, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) @@ -217,8 +205,8 @@ class UpdateProfileCubit extends Cubit { final user = await userRepository.getUser().first; if (user != null) { final newState = UpdateProfileLoaded( - username: Username.pure(user.username), - email: Email.pure(user.email), + username: Username.unvalidated(user.username), + email: Email.unvalidated(user.email), ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_screen.dart index f24b7805..cd4e9f22 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_screen.dart @@ -31,7 +31,7 @@ class UpdateProfileScreen extends StatelessWidget { } @visibleForTesting -class UpdateProfileView extends StatefulWidget { +class UpdateProfileView extends StatelessWidget { const UpdateProfileView({ required this.onUpdateProfileSuccess, Key? key, @@ -40,10 +40,46 @@ class UpdateProfileView extends StatefulWidget { final VoidCallback onUpdateProfileSuccess; @override - _UpdateProfileViewState createState() => _UpdateProfileViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + UpdateProfileLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _UpdateProfileForm( + onUpdateProfileSuccess: onUpdateProfileSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _UpdateProfileForm extends StatefulWidget { + const _UpdateProfileForm({ + required this.onUpdateProfileSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onUpdateProfileSuccess; + + @override + State<_UpdateProfileForm> createState() => _UpdateProfileFormState(); } -class _UpdateProfileViewState extends State { +class _UpdateProfileFormState extends State<_UpdateProfileForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -80,15 +116,20 @@ class _UpdateProfileViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + (oldState is UpdateProfileLoaded + ? oldState.submissionStatus + : null) != + (newState is UpdateProfileLoaded ? newState.submissionStatus : null), listener: (context, state) { if (state is UpdateProfileLoaded) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onUpdateProfileSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -97,53 +138,6 @@ class _UpdateProfileViewState extends State { } } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - UpdateProfileLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _UpdateProfileForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _UpdateProfileForm extends StatelessWidget { - const _UpdateProfileForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = UpdateProfileLocalizations.of(context); if (state is UpdateProfileLoaded) { @@ -159,10 +153,11 @@ class _UpdateProfileForm extends StatelessWidget { return Column( children: [ TextFormField( - focusNode: usernameFocusNode, + focusNode: _usernameFocusNode, initialValue: state.username.value, onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.person, @@ -183,10 +178,11 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextFormField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, initialValue: state.email.value, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -207,7 +203,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -226,7 +222,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -266,4 +262,13 @@ class _UpdateProfileForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _usernameFocusNode.dispose(); + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_state.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_state.dart index a07c21b5..c6748888 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_state.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/lib/src/update_profile_state.dart @@ -13,48 +13,52 @@ class UpdateProfileInProgress extends UpdateProfileState { class UpdateProfileLoaded extends UpdateProfileState { const UpdateProfileLoaded({ - required this.username, required this.email, - this.password = const OptionalPassword.pure(), - this.passwordConfirmation = const OptionalPasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + required this.username, + this.password = const OptionalPassword.unvalidated(), + this.passwordConfirmation = + const OptionalPasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final OptionalPassword password; final OptionalPasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; - bool get isSubmissionInProgress => status == FormzStatus.submissionInProgress; + bool get isSubmissionInProgress => + submissionStatus == SubmissionStatus.inProgress; UpdateProfileLoaded copyWith({ - Username? username, Email? email, + Username? username, OptionalPassword? password, OptionalPasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return UpdateProfileLoaded( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.yaml index abb39d30..11b78caf 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/update_profile/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: @@ -25,4 +25,5 @@ dev_dependencies: flutter_lints: ^1.0.4 flutter: + generate: true uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config.json deleted file mode 100644 index b61069b9..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:39.813212Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config_subset deleted file mode 100644 index eb4a2bf1..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/package_config_subset +++ /dev/null @@ -1,205 +0,0 @@ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.packages deleted file mode 100644 index c588a8ed..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/.packages +++ /dev/null @@ -1,57 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:39.792500. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -form_fields:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/form_fields.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/form_fields.dart index d8fcf757..ba899732 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/form_fields.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/form_fields.dart @@ -1,4 +1,5 @@ -export 'package:formz/formz.dart'; +export 'package:formz/formz.dart' + show FormzInput, FormzStatus, Formz, FormzStatusX; export 'src/email.dart'; export 'src/optional_password.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/email.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/email.dart index e0175644..a5933abb 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/email.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/email.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum EmailValidationError { - empty, - invalid, - alreadyRegistered, -} - -class Email extends FormzInput { - const Email.pure([String value = '']) - : isAlreadyRegistered = false, +class Email extends FormzInput + with EquatableMixin { + const Email.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Email.dirty( + const Email.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -22,6 +19,7 @@ class Email extends FormzInput { '([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])' ')|([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})\$', ); + final bool isAlreadyRegistered; @override @@ -36,15 +34,15 @@ class Email extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Email && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum EmailValidationError { + empty, + invalid, + alreadyRegistered, } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password.dart index 9bf657d0..0f230b6e 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password.dart @@ -1,14 +1,18 @@ import 'package:formz/formz.dart'; -enum OptionalPasswordValidationError { - invalid, -} - +/// Represents an optional password field. +/// +/// Useful when the password can or can't be changed, such as in the update +/// profile screen. class OptionalPassword extends FormzInput { - const OptionalPassword.pure([String value = '']) : super.pure(value); + const OptionalPassword.unvalidated([ + String value = '', + ]) : super.pure(value); - const OptionalPassword.dirty([String value = '']) : super.dirty(value); + const OptionalPassword.validated([ + String value = '', + ]) : super.dirty(value); @override OptionalPasswordValidationError? validator(String value) { @@ -19,3 +23,7 @@ class OptionalPassword : OptionalPasswordValidationError.invalid); } } + +enum OptionalPasswordValidationError { + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password_confirmation.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password_confirmation.dart index 5d06ea5c..70365b8c 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/optional_password_confirmation.dart @@ -1,17 +1,19 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum OptionalPasswordConfirmationValidationError { - empty, - invalid, -} - +/// Represents an optional password confirmation field. +/// +/// Used in conjunction with [OptionalPassword] when the password can or can't +/// be changed, such as in the update profile screen. class OptionalPasswordConfirmation - extends FormzInput { - const OptionalPasswordConfirmation.pure([String value = '']) - : password = const OptionalPassword.pure(), + extends FormzInput + with EquatableMixin { + const OptionalPasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const OptionalPassword.unvalidated(), super.pure(value); - const OptionalPasswordConfirmation.dirty( + const OptionalPasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -30,14 +32,14 @@ class OptionalPasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is OptionalPasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum OptionalPasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password.dart index c92b98ec..9ac850ca 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password.dart @@ -1,21 +1,27 @@ import 'package:formz/formz.dart'; -enum PasswordValidationError { - empty, - invalid, -} - class Password extends FormzInput { - const Password.pure([String value = '']) : super.pure(value); + const Password.unvalidated([ + String value = '', + ]) : super.pure(value); - const Password.dirty([String value = '']) : super.dirty(value); + const Password.validated([ + String value = '', + ]) : super.dirty(value); @override PasswordValidationError? validator(String value) { - return value.isEmpty - ? PasswordValidationError.empty - : (value.length >= 5 && value.length <= 120 - ? null - : PasswordValidationError.invalid); + if (value.isEmpty) { + return PasswordValidationError.empty; + } else if (value.length < 5 || value.length > 120) { + return PasswordValidationError.invalid; + } else { + return null; + } } } + +enum PasswordValidationError { + empty, + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password_confirmation.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password_confirmation.dart index 3295c24b..abb485ec 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/password_confirmation.dart @@ -1,17 +1,15 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum PasswordConfirmationValidationError { - empty, - invalid, -} - class PasswordConfirmation - extends FormzInput { - const PasswordConfirmation.pure([String value = '']) - : password = const Password.pure(), + extends FormzInput + with EquatableMixin { + const PasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const Password.unvalidated(), super.pure(value); - const PasswordConfirmation.dirty( + const PasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -28,14 +26,14 @@ class PasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is PasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum PasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/username.dart b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/username.dart index 652b8441..453ec1b8 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/username.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/lib/src/username.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum UsernameValidationError { - empty, - invalid, - alreadyTaken, -} - -class Username extends FormzInput { - const Username.pure([String value = '']) - : isAlreadyRegistered = false, +class Username extends FormzInput + with EquatableMixin { + const Username.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Username.dirty( + const Username.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -34,15 +31,15 @@ class Username extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Username && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum UsernameValidationError { + empty, + invalid, + alreadyTaken, } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.lock deleted file mode 100644 index a4332784..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.lock +++ /dev/null @@ -1,355 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "24.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - formz: - dependency: "direct main" - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.yaml index 33b7a0ea..feed53bc 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/form_fields/pubspec.yaml @@ -5,7 +5,8 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - formz: ^0.4.0 + formz: ^0.4.1 + equatable: ^2.0.3 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config.json deleted file mode 100644 index abb0b0a9..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config.json +++ /dev/null @@ -1,530 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive_generator", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_helper", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:42.827612Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config_subset deleted file mode 100644 index 33c1f365..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/package_config_subset +++ /dev/null @@ -1,349 +0,0 @@ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins-dependencies deleted file mode 100644 index c82a36fb..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:42.985243","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.packages deleted file mode 100644 index 228ca43c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/.packages +++ /dev/null @@ -1,93 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:42.805199. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -key_value_storage:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/key_value_storage.dart index 17ba9292..d1006080 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/key_value_storage.dart @@ -1,3 +1,3 @@ export 'package:hive/hive.dart'; export 'src/key_value_storage.dart'; -export 'src/models/models.dart'; \ No newline at end of file +export 'src/models/models.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/key_value_storage.dart index fc5c43fa..e527f2cd 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/key_value_storage.dart @@ -1,8 +1,4 @@ -import 'package:hive/hive.dart'; import 'package:key_value_storage/key_value_storage.dart'; -import 'package:key_value_storage/src/models/dark_mode_preference_cm.dart'; -import 'package:key_value_storage/src/models/models.dart'; -import 'package:key_value_storage/src/models/user_cm.dart'; import 'package:meta/meta.dart'; import 'package:path_provider/path_provider.dart'; @@ -23,7 +19,6 @@ class KeyValueStorage { static const _quoteListPagesBoxKey = 'quote-list-pages'; static const _favoriteQuoteListPagesBoxKey = 'favorite-quote-list-pages'; static const _darkModePreferenceBoxKey = 'dark-mode-preference'; - static const _userBoxKey = 'user'; KeyValueStorage({ @visibleForTesting HiveInterface? hive, @@ -32,10 +27,7 @@ class KeyValueStorage { _hive ..registerAdapter(QuoteListPageCMAdapter()) ..registerAdapter(QuoteCMAdapter()) - ..registerAdapter(DarkModePreferenceCMAdapter()) - ..registerAdapter( - UserCMAdapter(), - ); + ..registerAdapter(DarkModePreferenceCMAdapter()); } catch (_) { throw Exception( 'You shouldn\'t have more than one [KeyValueStorage] instance in your ' @@ -57,11 +49,6 @@ class KeyValueStorage { isTemporary: true, ); - Future> get userBox => _openHiveBox( - _userBoxKey, - isTemporary: false, - ); - Future> get darkModePreferenceBox => _openHiveBox( _darkModePreferenceBoxKey, diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/models.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/models.dart index a8daf157..28f9e853 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/models.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/models.dart @@ -1,4 +1,3 @@ +export 'dark_mode_preference_cm.dart'; export 'quote_cm.dart'; export 'quote_list_page_cm.dart'; -export 'dark_mode_preference_cm.dart'; -export 'user_cm.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.dart deleted file mode 100644 index bbd7ab8c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:hive/hive.dart'; - -part 'user_cm.g.dart'; - -@HiveType(typeId: 2) -class UserCM { - UserCM({ - required this.username, - required this.email, - }); - - @HiveField(0) - final String username; - @HiveField(1) - final String email; -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.g.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.g.dart deleted file mode 100644 index 47959a1e..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/src/models/user_cm.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class UserCMAdapter extends TypeAdapter { - @override - final int typeId = 2; - - @override - UserCM read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return UserCM( - username: fields[0] as String, - email: fields[1] as String, - ); - } - - @override - void write(BinaryWriter writer, UserCM obj) { - writer - ..writeByte(2) - ..writeByte(0) - ..write(obj.username) - ..writeByte(1) - ..write(obj.email); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is UserCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/pubspec.lock deleted file mode 100644 index de687d15..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/pubspec.lock +++ /dev/null @@ -1,604 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - hive: - dependency: "direct main" - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - hive_generator: - dependency: "direct dev" - description: - name: hive_generator - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: "direct main" - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/test/common_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/test/common_test.dart index 94779576..ccc2cf56 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/test/common_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/test/common_test.dart @@ -8,7 +8,7 @@ import 'package:test/test.dart'; void main() { - test('Forgot my password', (){ + test('Forgot my password', () { // Build our app and trigger a frame. expect(1, 1); }); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config.json deleted file mode 100644 index a9fa6a0f..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:45.519125Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config_subset deleted file mode 100644 index 447c33aa..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/package_config_subset +++ /dev/null @@ -1,265 +0,0 @@ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins deleted file mode 100644 index 4d750fc3..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins-dependencies deleted file mode 100644 index 006f51a1..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"linux":[],"windows":[],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]}],"date_created":"2022-04-19 02:28:45.658727","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.packages deleted file mode 100644 index dec2a9eb..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/.packages +++ /dev/null @@ -1,72 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:45.501670. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -monitoring:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart index 021cc9a5..d2d3fba8 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart @@ -1 +1,8 @@ -export 'src/logger.dart'; +import 'package:firebase_core/firebase_core.dart'; + +export 'src/dynamic_link_service.dart'; +export 'src/analytics_service.dart'; +export 'src/error_reporting_service.dart'; +export 'src/remote_value_service.dart'; + +Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/analytics_service.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/analytics_service.dart new file mode 100644 index 00000000..d6db4664 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/analytics_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseAnalytics]. +class AnalyticsService { + AnalyticsService({ + @visibleForTesting FirebaseAnalytics? analytics, + }) : _analytics = analytics ?? FirebaseAnalytics.instance; + + final FirebaseAnalytics _analytics; + + Future setCurrentScreen(String screenName) { + return _analytics.setCurrentScreen( + screenName: screenName, + ); + } + + Future logEvent({ + required String name, + Map? parameters, + }) { + return _analytics.logEvent( + name: name, + parameters: parameters, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart new file mode 100644 index 00000000..c2b15a41 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart @@ -0,0 +1,60 @@ +import 'dart:async'; + +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:flutter/foundation.dart'; + +export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' + show SocialMetaTagParameters; + +typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); + +/// Wrapper around [FirebaseDynamicLinks]. +class DynamicLinkService { + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; + + DynamicLinkService({ + @visibleForTesting FirebaseDynamicLinks? dynamicLinks, + }) : _dynamicLinks = dynamicLinks ?? FirebaseDynamicLinks.instance; + + final FirebaseDynamicLinks _dynamicLinks; + + Future generateDynamicLinkUrl({ + required String path, + SocialMetaTagParameters? socialMetaTagParameters, + }) async { + final parameters = DynamicLinkParameters( + uriPrefix: _domainUriPrefix, + link: Uri.parse( + '$_domainUriPrefix$path', + ), + androidParameters: const AndroidParameters( + packageName: _androidPackageName, + ), + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, + ), + socialMetaTagParameters: socialMetaTagParameters, + ); + + final shortLink = await _dynamicLinks.buildShortLink(parameters); + return shortLink.shortUrl.toString(); + } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/error_reporting_service.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/error_reporting_service.dart new file mode 100644 index 00000000..e841435a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/error_reporting_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseCrashlytics]. +class ErrorReportingService { + ErrorReportingService({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + final FirebaseCrashlytics _crashlytics; + + Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) { + return _crashlytics.recordFlutterError(flutterErrorDetails); + } + + Future recordError( + dynamic exception, + StackTrace? stack, { + bool fatal = false, + }) { + return _crashlytics.recordError( + exception, + stack, + fatal: fatal, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/logger.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/logger.dart deleted file mode 100644 index 9c58f71d..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/logger.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:logger/logger.dart'; - -late Logger log = Logger(level: kDebugMode ? Level.verbose : Level.nothing); - -FirebaseAnalytics analytics = FirebaseAnalytics(); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/remote_value_service.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/remote_value_service.dart new file mode 100644 index 00000000..3adf95c1 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -0,0 +1,24 @@ +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseRemoteConfig]. +class RemoteValueService { + static const _gridQuotesViewEnabledKey = 'grid_quotes_view_enabled'; + + RemoteValueService({ + @visibleForTesting FirebaseRemoteConfig? remoteConfig, + }) : _remoteConfig = remoteConfig ?? FirebaseRemoteConfig.instance; + + final FirebaseRemoteConfig _remoteConfig; + + Future load() async { + await _remoteConfig.setDefaults({ + _gridQuotesViewEnabledKey: true, + }); + await _remoteConfig.fetchAndActivate(); + } + + bool get isGridQuotesViewEnabled => _remoteConfig.getBool( + _gridQuotesViewEnabledKey, + ); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.lock deleted file mode 100644 index 374a480d..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.lock +++ /dev/null @@ -1,455 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "8.3.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0+1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logger: - dependency: "direct main" - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.12.13+hotfix.5" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.yaml index d5253b00..9ee1fb00 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/pubspec.yaml @@ -1,5 +1,4 @@ name: monitoring -version: 0.0.1 publish_to: none environment: @@ -8,8 +7,11 @@ environment: dependencies: flutter: sdk: flutter - firebase_analytics: ^8.3.0 - logger: ^1.0.0 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/test/common_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config.json deleted file mode 100644 index e81894fe..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,452 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:28:48.356798Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config_subset deleted file mode 100644 index 449f433c..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,297 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins-dependencies deleted file mode 100644 index 286e4157..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:48.501224","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.packages deleted file mode 100644 index 5c197abc..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/.packages +++ /dev/null @@ -1,80 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:48.335803. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/pubspec.lock deleted file mode 100644 index df68ba29..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/quote_repository/pubspec.lock +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config.json deleted file mode 100644 index 8b4fc834..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,464 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:28:51.194643Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config_subset deleted file mode 100644 index 4b7f540b..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,305 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins-dependencies deleted file mode 100644 index 0ce7d6dc..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:28:51.358054","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.packages b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.packages deleted file mode 100644 index 97e58961..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/.packages +++ /dev/null @@ -1,82 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:28:51.169362. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -user_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/cache_to_domain.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/cache_to_domain.dart index 85f78b5a..d989044e 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/cache_to_domain.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/cache_to_domain.dart @@ -13,12 +13,3 @@ extension DarkModePreferenceCMToDomain on DarkModePreferenceCM { } } } - -extension UserCMToDomain on UserCM { - User toDomainModel() { - return User( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/mappers.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/mappers.dart index 529b9b9b..a6836bb8 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/mappers.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/mappers.dart @@ -1,3 +1,3 @@ export 'cache_to_domain.dart'; export 'domain_to_cache.dart'; -export 'remote_to_cache.dart'; +export 'remote_to_domain.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_cache.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_cache.dart deleted file mode 100644 index d10ee8c1..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_cache.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension UserRMToCM on UserRM { - UserCM toCacheModel() { - return UserCM( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_domain.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_domain.dart new file mode 100644 index 00000000..30e42e34 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/mappers/remote_to_domain.dart @@ -0,0 +1,11 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:fav_qs_api/fav_qs_api.dart'; + +extension UserRMToDomain on UserRM { + User toDomainModel() { + return User( + username: username, + email: email, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_local_storage.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_local_storage.dart index 2d22639f..ef246492 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_local_storage.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_local_storage.dart @@ -16,19 +16,4 @@ class UserLocalStorage { final box = await noSqlStorage.darkModePreferenceBox; return box.get(0); } - - Future upsertUser(UserCM user) async { - final box = await noSqlStorage.userBox; - await box.put(0, user); - } - - Future getUser() async { - final box = await noSqlStorage.userBox; - return box.get(0); - } - - Future deleteUser() async { - final box = await noSqlStorage.userBox; - await box.clear(); - } } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_repository.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_repository.dart index d90ed47c..8562502c 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_repository.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_repository.dart @@ -1,4 +1,3 @@ -import 'package:async/async.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:key_value_storage/key_value_storage.dart'; @@ -26,18 +25,6 @@ class UserRepository { final BehaviorSubject _userSubject = BehaviorSubject(); final BehaviorSubject _darkModePreferenceSubject = BehaviorSubject(); - late final AsyncMemoizer _userTokenNormalizationMemoizer = AsyncMemoizer() - ..runOnce( - () async { - // If the app is uninstalled while the user was authenticated, we need to - // manually delete the token from our secure storage, since it persists - // between app installs. - final user = await _localStorage.getUser(); - if (user == null) { - await _secureStorage.deleteUserToken(); - } - }, - ); Future upsertDarkModePreference(DarkModePreference preference) async { await _localStorage.upsertDarkModePreference( @@ -60,23 +47,21 @@ class UserRepository { Future signIn(String email, String password) async { try { - final user = await remoteApi.signIn( + final apiUser = await remoteApi.signIn( email, password, ); - final cacheUser = user.toCacheModel(); - await Future.wait([ - _secureStorage.upsertUserToken( - user.token, - ), - _localStorage.upsertUser( - cacheUser, - ) - ]); + await _secureStorage.upsertUserInfo( + username: apiUser.username, + email: apiUser.email, + token: apiUser.token, + ); + + final domainUser = apiUser.toDomainModel(); _userSubject.add( - cacheUser.toDomainModel(), + domainUser, ); } on InvalidCredentialsFavQsException catch (_) { throw InvalidCredentialsException(); @@ -85,13 +70,35 @@ class UserRepository { Stream getUser() async* { if (!_userSubject.hasValue) { - final cachedUser = await _localStorage.getUser(); - _userSubject.add(cachedUser?.toDomainModel()); + final userInfo = await Future.wait([ + _secureStorage.getUserEmail(), + _secureStorage.getUsername(), + ]); + + final email = userInfo[0]; + final username = userInfo[1]; + + if (email != null && username != null) { + _userSubject.add( + User( + email: email, + username: username, + ), + ); + } else { + _userSubject.add( + null, + ); + } } yield* _userSubject.stream; } + Future getUserToken() { + return _secureStorage.getUserToken(); + } + Future signUp( String username, String email, @@ -104,22 +111,17 @@ class UserRepository { password, ); - final cacheUser = UserCM( + await _secureStorage.upsertUserInfo( username: username, email: email, + token: userToken, ); - await Future.wait([ - _localStorage.upsertUser( - cacheUser, - ), - _secureStorage.upsertUserToken( - userToken, - ), - ]); - _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } catch (error) { if (error is UsernameAlreadyTakenFavQsException) { @@ -142,14 +144,17 @@ class UserRepository { email, newPassword, ); - final cacheUser = UserCM( + + await _secureStorage.upsertUserInfo( username: username, email: email, ); - await _localStorage.upsertUser(cacheUser); _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } on UsernameAlreadyTakenFavQsException catch (_) { throw UsernameAlreadyTakenException(); @@ -158,22 +163,11 @@ class UserRepository { Future signOut() async { await remoteApi.signOut(); - await Future.wait( - [ - _localStorage.deleteUser(), - _secureStorage.deleteUserToken(), - ], - ); + await _secureStorage.deleteUserInfo(); _userSubject.add(null); } Future requestPasswordResetEmail(String email) async { await remoteApi.requestPasswordResetEmail(email); } - - Future getUserToken() async { - await _userTokenNormalizationMemoizer.future; - final userToken = await _secureStorage.getUserToken(); - return userToken; - } } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_secure_storage.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_secure_storage.dart index 57f93b91..f696a44f 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_secure_storage.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/lib/src/user_secure_storage.dart @@ -1,7 +1,9 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class UserSecureStorage { - static const _userTokenKey = 'fav-qs-user-token'; + static const _tokenKey = 'wonder-words-token'; + static const _usernameKey = 'wonder-words-username'; + static const _emailKey = 'wonder-words-email'; const UserSecureStorage({ FlutterSecureStorage? secureStorage, @@ -9,16 +11,48 @@ class UserSecureStorage { final FlutterSecureStorage _secureStorage; - Future upsertUserToken(String token) => _secureStorage.write( - key: _userTokenKey, - value: token, + Future upsertUserInfo({ + required String username, + required String email, + String? token, + }) => + Future.wait([ + _secureStorage.write( + key: _emailKey, + value: email, + ), + _secureStorage.write( + key: _usernameKey, + value: username, + ), + if (token != null) + _secureStorage.write( + key: _tokenKey, + value: token, + ) + ]); + + Future deleteUserInfo() => Future.wait([ + _secureStorage.delete( + key: _tokenKey, + ), + _secureStorage.delete( + key: _usernameKey, + ), + _secureStorage.delete( + key: _emailKey, + ), + ]); + + Future getUserToken() => _secureStorage.read( + key: _tokenKey, ); - Future deleteUserToken() => _secureStorage.delete( - key: _userTokenKey, + Future getUserEmail() => _secureStorage.read( + key: _emailKey, ); - Future getUserToken() => _secureStorage.read( - key: _userTokenKey, + Future getUsername() => _secureStorage.read( + key: _usernameKey, ); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.lock deleted file mode 100644 index 0aaed3e7..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.lock +++ /dev/null @@ -1,527 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/common_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/propagate-config-files.sh b/11-create-your-own-widget-catalog/projects/starter/propagate-config-files.sh new file mode 100644 index 00000000..e27a6bf9 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/propagate-config-files.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Copyright (c) 2021 Razeware LLC +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# Notwithstanding the foregoing, you may not use, copy, modify, +# merge, publish, distribute, sublicense, create a derivative work, +# and/or sell copies of the Software in any work that is designed, +# intended, or marketed for pedagogical or instructional purposes +# related to programming, coding, application development, or +# information technology. Permission for such use, copying, +# modification, merger, publication, distribution, sublicensing, +# creation of derivative works, or sale is expressly withheld. +# +# This project and source code may use libraries or frameworks +# that are released under various Open-Source licenses. Use of +# those libraries and frameworks are governed by their own +# individual licenses. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +DEBUG=false +if [ "$DEBUG" = true ]; then + STD_OUT=/dev/tty +else + STD_OUT=/dev/null +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + IS_MACOS=true +else + IS_MACOS=false +fi + +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +WANTED_SUBFOLDER_1='.idea' +WANTED_SUBFOLDER_2='.vscode' + +WANTED_SUBFOLDER_3='android/app/src/google-services.json' +WANTED_SUBFOLDER_4='ios/Runner/GoogleService-Info.plist' + +ARR_WANTED=( + "${WANTED_SUBFOLDER_1}" + "${WANTED_SUBFOLDER_2}" + "${WANTED_SUBFOLDER_3}" + "${WANTED_SUBFOLDER_4}" +) + +# Get root directory: /mnt/c/scripts/epidemy/ +ROOT_DIR="$(dirname "$(dirname "$(dirname "$(echo $SCRIPT_DIR)")")")" + +# Double check our core locations aren't empty +[ -z "$ROOT_DIR" ] && echo 'ROOT_DIR variable is unset!' && exit 1 +[ -z "$SCRIPT_DIR" ] && echo 'SCRIPT_DIR variable is unset!' && exit 1 + +# All folders within root (e.g. 01-, 02-, 03-, 04-) +ALL_ROOT=$(find "${ROOT_DIR}" -maxdepth 3 -type d | grep -E '/[0-9]{2}[^/]*/projects/(starter|final|challenge)') + +# Just the folders we care about (not template) +FOLDERS=$(printf "${ALL_ROOT}" | grep -v $(printf ${SCRIPT_DIR})) + +{ + echo + echo ===Found Folders=== + echo '(Template)' $SCRIPT_DIR + echo "${FOLDERS}" + + echo + echo ===Creating Items=== + printf "${FOLDERS}\n" | while read root ; do + + echo $root + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + dest_item="${root}/${wanted}" + dest_dir=$(dirname "${dest_item}") + + # Ensure template file exists + if [[ ! -e "${orig_item}" ]]; then + continue + fi + + # Skip item if there isn't a path to copy destination + if [ ! -d "${dest_dir}" ]; then + printf "\tDestination Directory Missing - ${wanted}\n" + continue + fi + + # =============COPY============= # + if [ "$IS_MACOS" = true ]; then + # Doesn't support -T, uses source trailing / + cp -r "${orig_item}" "${dest_item}" + else + # -T to copy entire folder, instead of contents + cp -rT "${orig_item}" "${dest_item}" + fi + printf "\tCreated! - ${wanted}\n" + # =============COPY============= # + + done + echo + done + + echo + echo ===Issues=== + + # Print an error only if we're missing both + ERR_IF_BOTH_1=( + "/src/google-services.json$" + "/Runner/GoogleService-Info.plist$" + ) + BOTH_MISSING_1=true + + # Print an error only if we're missing both + ERR_IF_BOTH_2=( + ".idea$" + ".vscode$" + ) + BOTH_MISSING_2=true + + # Don't perform basic missing check on these items + # Use this if other checks should be used, e.g. ERR_IF_BOTH + # Uses regex to check, note the $ for EOL and the OR symbol + NO_ERR="\/(src|Runner)\/(GoogleService-Info.plist|google-services.json)$" + NO_ERR="${NO_ERR}|\.(vscode|idea)$" + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_1[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_1 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_1=false + + # End this checker if found a match + [ "$BOTH_MISSING_1" = false ] && break + fi + done + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_2[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_2 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_2=false + + # End this checker if found a match + [ "$BOTH_MISSING_2" = false ] && break + fi + done + + # Don't print missing file error, + # If item path matches NO_ERR pattern + echo ${wanted} | grep -Eq ${NO_ERR} + [ $? -eq 0 ] && continue + + # Generic file missing error + [ ! -e "${orig_item}" ] && echo "${orig_item} Does not exist!" 1>&2 + done + + [ "$BOTH_MISSING_1" = true ] && echo "Your Firebase configuration file(s) couldn’t be found. Please, make sure you have configured at least the dev app for Android or iOS. You won't be able to run the app otherwise." 1>&2 && exit 1 + [ "$BOTH_MISSING_2" = true ] && echo "Your IDE’s custom running configs couldn’t be found. Please, try following the instructions again, or you'll need to run the app from the command line every time by using: flutter run --dart-define=fav-qs-app-token=YOUR_KEY" 1>&2 && exit 1 + +} > $STD_OUT + +echo Done! +exit 0 diff --git a/11-create-your-own-widget-catalog/projects/starter/pubspec.lock b/11-create-your-own-widget-catalog/projects/starter/pubspec.lock index d6747368..803bac5d 100644 --- a/11-create-your-own-widget-catalog/projects/starter/pubspec.lock +++ b/11-create-your-own-widget-catalog/projects/starter/pubspec.lock @@ -7,35 +7,35 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" bloc: dependency: transitive description: name: bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.0-dev.3" + version: "8.0.3" + bloc_concurrency: + dependency: transitive + description: + name: bloc_concurrency + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" boolean_selector: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -84,21 +84,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" dio: dependency: transitive description: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -133,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -141,62 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: "direct main" - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.6.6" + firebase_crashlytics: + dependency: transitive + description: + name: firebase_crashlytics + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.4" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.10" firebase_dynamic_links: - dependency: "direct main" + dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" + firebase_remote_config: + dependency: transitive + description: + name: firebase_remote_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + firebase_remote_config_platform_interface: + dependency: transitive + description: + name: firebase_remote_config_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.10" + firebase_remote_config_web: + dependency: transitive + description: + name: firebase_remote_config_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -208,14 +243,12 @@ packages: name: flutter_bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.0-dev.2" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.1" + version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -241,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -279,14 +312,12 @@ packages: name: formz url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" - graphs: + version: "0.4.1" + fuchsia_remote_debug_protocol: dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -294,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" http_parser: dependency: transitive description: @@ -308,22 +332,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - image: + infinite_scroll_pagination: dependency: transitive description: - name: image + name: infinite_scroll_pagination url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" - infinite_scroll_pagination: - dependency: transitive - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -337,14 +357,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -359,55 +379,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: path: "packages/monitoring" relative: true source: path - version: "0.0.1" + version: "0.0.0" nested: dependency: transitive description: @@ -415,27 +421,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: "direct main" - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.1" + version: "0.5.1+1" path_parsing: dependency: transitive description: @@ -449,70 +448,77 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.10" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.14" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "2.0.6" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.4.0" platform: dependency: transitive description: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.2" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" profile_menu: dependency: "direct main" description: @@ -526,7 +532,7 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.1" + version: "6.0.2" quote_details: dependency: "direct main" description: @@ -548,69 +554,62 @@ packages: relative: true source: path version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.32" routemaster: dependency: "direct main" description: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "0.9.5" + version: "1.0.1" rxdart: dependency: transitive description: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.1" + version: "0.27.3" share_plus: dependency: transitive description: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -636,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -658,34 +657,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -699,42 +712,56 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.9" + version: "6.1.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -748,35 +775,42 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.5" + version: "2.5.2" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" + version: "5.3.1" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/11-create-your-own-widget-catalog/projects/starter/pubspec.yaml b/11-create-your-own-widget-catalog/projects/starter/pubspec.yaml index 7c92d0b7..b2dd1e71 100644 --- a/11-create-your-own-widget-catalog/projects/starter/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/starter/pubspec.yaml @@ -25,12 +25,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^0.9.5 - firebase: ^9.0.1 - firebase_dynamic_links: ^2.0.7 - package_info: ^2.0.2 - monitoring: - path: packages/monitoring + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -57,17 +52,21 @@ dependencies: path: packages/domain_models component_library: path: packages/component_library + monitoring: + path: packages/monitoring # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter - flutter_launcher_icons: ^0.9.0 flutter_lints: ^1.0.4 - + + flutter_icons: android: true ios: true @@ -83,34 +82,4 @@ 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 - - # To add assets to your application, add an assets section, like this: - assets: - - assets/animations/ - - # 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 + uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/test/example_test.dart b/11-create-your-own-widget-catalog/projects/starter/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/starter/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/starter/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/11-create-your-own-widget-catalog/projects/starter/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From 45446b3fa9e1c1db0dfaf9a53251deb6b7fa427a Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 21:08:48 +0200 Subject: [PATCH 06/30] Minor starter project update --- .../features/profile_menu/lib/src/profile_menu_screen.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index e3017b85..00c58570 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -124,7 +124,10 @@ class ProfileMenuView extends StatelessWidget { ], ); } else { - return const CenteredCircularProgressIndicator(); + // TODO: replace with centered circular progress indicator + return const Center( + child: CircularProgressIndicator(), + ); } }, ), From e00476a918046f5f4ce4eec3bf9e7bc1a38356d4 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Thu, 22 Sep 2022 23:53:02 +0200 Subject: [PATCH 07/30] Adding missing platforms for storybook project --- .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../example/test/widget_test.dart | 30 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 ++++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ 1306 files changed, 61741 insertions(+), 42 deletions(-) create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/main.cc create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/main.cc create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/main.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Info.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/Runner.rc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/main.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/resource.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/main.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/main.cc create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/main.cc create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/main.cc create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/main.cc create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/.metadata create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/README.md create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/analysis_options.yaml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/build.gradle create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/build.gradle create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle.properties create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/android/settings.gradle create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/lib/main.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/lib/stories.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/lib/story_app.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/pubspec.yaml create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/favicon.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/index.html create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/web/manifest.json create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/main.cc create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 08-deep-linking/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/main.cc create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/main.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/main.cc create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.h diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/.metadata b/01-setting-up-your-environment/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/.metadata +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/.gitignore b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/CMakeLists.txt b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/main.cc b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.cc b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/.gitignore b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Info.plist b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart b/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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:example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/.gitignore b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/CMakeLists.txt b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/Runner.rc b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/main.cpp b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/resource.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.cpp b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/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/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.h b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/.metadata b/01-setting-up-your-environment/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/01-setting-up-your-environment/projects/starter/packages/component_library/example/.metadata +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/.gitignore b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/main.cc b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.cc b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/.gitignore b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart b/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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:example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/.gitignore b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/main.cpp b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/resource.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/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/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/.metadata b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/.metadata +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/.gitignore b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/main.cc b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.cc b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/.gitignore b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Info.plist b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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:example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/.gitignore b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/Runner.rc b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/main.cpp b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/resource.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.cpp b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.h b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/.metadata b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/.metadata +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/.gitignore b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/main.cc b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.cc b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/.gitignore b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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:example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/.gitignore b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/main.cpp b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/resource.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/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/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/.metadata b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/.metadata +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/main.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jR^;j87-Auq zoUlN^K{r-Q+XN;zI ze|?*NFmgt#V#GwrSWaz^2G&@SBmck6ZcIFMww~vE<1E?M2#KUn1CzsB6D2+0SuRV@ zV2kK5HvIGB{HX-hQzs0*AB%5$9RJ@a;)Ahq#p$GSP91^&hi#6sg*;a~dt}4AclK>h z_3MoPRQ{i;==;*1S-mY<(JFzhAxMI&<61&m$J0NDHdJ3tYx~j0%M-uN6Zl8~_0DOkGXc0001@sz3l12C6Xg{AT~( zm6w64BA|AX`Ve)YY-glyudNN>MAfkXz-T7`_`fEolM;0T0BA)(02-OaW z0*cW7Z~ec94o8&g0D$N>b!COu{=m}^%oXZ4?T8ZyPZuGGBPBA7pbQMoV5HYhiT?%! zcae~`(QAN4&}-=#2f5fkn!SWGWmSeCISBcS=1-U|MEoKq=k?_x3apK>9((R zuu$9X?^8?@(a{qMS%J8SJPq))v}Q-ZyDm6Gbie0m92=`YlwnQPQP1kGSm(N2UJ3P6 z^{p-u)SSCTW~c1rw;cM)-uL2{->wCn2{#%;AtCQ!m%AakVs1K#v@(*-6QavyY&v&*wO_rCJXJuq$c$7ZjsW+pJo-$L^@!7X04CvaOpPyfw|FKvu;e(&Iw>Tbg zL}#8e^?X%TReXTt>gsBByt0kSU20oQx*~P=4`&tcZ7N6t-6LiK{LxX*p6}9c<0Pu^ zLx1w_P4P2V>bX=`F%v$#{sUDdF|;rbI{p#ZW`00Bgh(eB(nOIhy8W9T>3aQ=k8Z9% zB+TusFABF~J?N~fAd}1Rme=@4+1=M{^P`~se7}e3;mY0!%#MJf!XSrUC{0uZqMAd7%q zQY#$A>q}noIB4g54Ue)x>ofVm3DKBbUmS4Z-bm7KdKsUixva)1*&z5rgAG2gxG+_x zqT-KNY4g7eM!?>==;uD9Y4iI(Hu$pl8!LrK_Zb}5nv(XKW{9R144E!cFf36p{i|8pRL~p`_^iNo z{mf7y`#hejw#^#7oKPlN_Td{psNpNnM?{7{R-ICBtYxk>?3}OTH_8WkfaTLw)ZRTfxjW+0>gMe zpKg~`Bc$Y>^VX;ks^J0oKhB#6Ukt{oQhN+o2FKGZx}~j`cQB%vVsMFnm~R_1Y&Ml? zwFfb~d|dW~UktY@?zkau>Owe zRroi(<)c4Ux&wJfY=3I=vg)uh;sL(IYY9r$WK1$F;jYqq1>xT{LCkIMb3t2jN8d`9 z=4(v-z7vHucc_fjkpS}mGC{ND+J-hc_0Ix4kT^~{-2n|;Jmn|Xf9wGudDk7bi*?^+ z7fku8z*mbkGm&xf&lmu#=b5mp{X(AwtLTf!N`7FmOmX=4xwbD=fEo8CaB1d1=$|)+ z+Dlf^GzGOdlqTO8EwO?8;r+b;gkaF^$;+#~2_YYVH!hD6r;PaWdm#V=BJ1gH9ZK_9 zrAiIC-)z)hRq6i5+$JVmR!m4P>3yJ%lH)O&wtCyum3A*})*fHODD2nq!1@M>t@Za+ zH6{(Vf>_7!I-APmpsGLYpl7jww@s5hHOj5LCQXh)YAp+y{gG(0UMm(Ur z3o3n36oFwCkn+H*GZ-c6$Y!5r3z*@z0`NrB2C^q#LkOuooUM8Oek2KBk}o1PU8&2L z4iNkb5CqJWs58aR394iCU^ImDqV;q_Pp?pl=RB2372(Io^GA^+oKguO1(x$0<7w3z z)j{vnqEB679Rz4i4t;8|&Zg77UrklxY9@GDq(ZphH6=sW`;@uIt5B?7Oi?A0-BL}(#1&R;>2aFdq+E{jsvpNHjLx2t{@g1}c~DQcPNmVmy| zNMO@ewD^+T!|!DCOf}s9dLJU}(KZy@Jc&2Nq3^;vHTs}Hgcp`cw&gd7#N}nAFe3cM1TF%vKbKSffd&~FG9y$gLyr{#to)nxz5cCASEzQ}gz8O)phtHuKOW6p z@EQF(R>j%~P63Wfosrz8p(F=D|Mff~chUGn(<=CQbSiZ{t!e zeDU-pPsLgtc#d`3PYr$i*AaT!zF#23htIG&?QfcUk+@k$LZI}v+js|yuGmE!PvAV3 ztzh90rK-0L6P}s?1QH`Ot@ilbgMBzWIs zIs6K<_NL$O4lwR%zH4oJ+}JJp-bL6~%k&p)NGDMNZX7)0kni&%^sH|T?A)`z z=adV?!qnWx^B$|LD3BaA(G=ePL1+}8iu^SnnD;VE1@VLHMVdSN9$d)R(Wk{JEOp(P zm3LtAL$b^*JsQ0W&eLaoYag~=fRRdI>#FaELCO7L>zXe6w*nxN$Iy*Q*ftHUX0+N- zU>{D_;RRVPbQ?U+$^%{lhOMKyE5>$?U1aEPist+r)b47_LehJGTu>TcgZe&J{ z{q&D{^Ps~z7|zj~rpoh2I_{gAYNoCIJmio3B}$!5vTF*h$Q*vFj~qbo%bJCCRy509 zHTdDh_HYH8Zb9`}D5;;J9fkWOQi%Y$B1!b9+ESj+B@dtAztlY2O3NE<6HFiqOF&p_ zW-K`KiY@RPSY-p9Q99}Hcd05DT79_pfb{BV7r~?9pWh=;mcKBLTen%THFPo2NN~Nf zriOtFnqx}rtO|A6k!r6 zf-z?y-UD{dT0kT9FJ`-oWuPHbo+3wBS(}?2ql(+e@VTExmfnB*liCb zmeI+v5*+W_L;&kQN^ChW{jE0Mw#0Tfs}`9bk3&7UjxP^Ke(%eJu2{VnW?tu7Iqecm zB5|=-QdzK$=h50~{X3*w4%o1FS_u(dG2s&427$lJ?6bkLet}yYXCy)u_Io1&g^c#( z-$yYmSpxz{>BL;~c+~sxJIe1$7eZI_9t`eB^Pr0)5CuA}w;;7#RvPq|H6!byRzIJG ziQ7a4y_vhj(AL`8PhIm9edCv|%TX#f50lt8+&V+D4<}IA@S@#f4xId80oH$!_!q?@ zFRGGg2mTv&@76P7aTI{)Hu%>3QS_d)pQ%g8BYi58K~m-Ov^7r8BhX7YC1D3vwz&N8{?H*_U7DI?CI)+et?q|eGu>42NJ?K4SY zD?kc>h@%4IqNYuQ8m10+8xr2HYg2qFNdJl=Tmp&ybF>1>pqVfa%SsV*BY$d6<@iJA ziyvKnZ(~F9xQNokBgMci#pnZ}Igh0@S~cYcU_2Jfuf|d3tuH?ZSSYBfM(Y3-JBsC|S9c;# zyIMkPxgrq};0T09pjj#X?W^TFCMf1-9P{)g88;NDI+S4DXe>7d3Mb~i-h&S|Jy{J< zq3736$bH?@{!amD!1Ys-X)9V=#Z={fzsjVYMX5BG6%}tkzwC#1nQLj1y1f#}8**4Y zAvDZHw8)N)8~oWC88CgzbwOrL9HFbk4}h85^ptuu7A+uc#$f^9`EWv1Vr{5+@~@Uv z#B<;-nt;)!k|fRIg;2DZ(A2M2aC65kOIov|?Mhi1Sl7YOU4c$T(DoRQIGY`ycfkn% zViHzL;E*A{`&L?GP06Foa38+QNGA zw3+Wqs(@q+H{XLJbwZzE(omw%9~LPZfYB|NF5%j%E5kr_xE0u;i?IOIchn~VjeDZ) zAqsqhP0vu2&Tbz3IgJvMpKbThC-@=nk)!|?MIPP>MggZg{cUcKsP8|N#cG5 zUXMXxcXBF9`p>09IR?x$Ry3;q@x*%}G#lnB1}r#!WL88I@uvm}X98cZ8KO&cqT1p> z+gT=IxPsq%n4GWgh-Bk8E4!~`r@t>DaQKsjDqYc&h$p~TCh8_Mck5UB84u6Jl@kUZCU9BA-S!*bf>ZotFX9?a_^y%)yH~rsAz0M5#^Di80_tgoKw(egN z`)#(MqAI&A84J#Z<|4`Co8`iY+Cv&iboMJ^f9ROUK0Lm$;-T*c;TCTED_0|qfhlcS zv;BD*$Zko#nWPL}2K8T-?4}p{u)4xon!v_(yVW8VMpxg4Kh^J6WM{IlD{s?%XRT8P|yCU`R&6gwB~ zg}{At!iWCzOH37!ytcPeC`(({ovP7M5Y@bYYMZ}P2Z3=Y_hT)4DRk}wfeIo%q*M9UvXYJq!-@Ly79m5aLD{hf@BzQB>FdQ4mw z6$@vzSKF^Gnzc9vbccii)==~9H#KW<6)Uy1wb~auBn6s`ct!ZEos`WK8e2%<00b%# zY9Nvnmj@V^K(a_38dw-S*;G-(i(ETuIwyirs?$FFW@|66a38k+a%GLmucL%Wc8qk3 z?h_4!?4Y-xt)ry)>J`SuY**fuq2>u+)VZ+_1Egzctb*xJ6+7q`K$^f~r|!i?(07CD zH!)C_uerf-AHNa?6Y61D_MjGu*|wcO+ZMOo4q2bWpvjEWK9yASk%)QhwZS%N2_F4& z16D18>e%Q1mZb`R;vW{+IUoKE`y3(7p zplg5cBB)dtf^SdLd4n60oWie|(ZjgZa6L*VKq02Aij+?Qfr#1z#fwh92aV-HGd^_w zsucG24j8b|pk>BO7k8dS86>f-jBP^Sa}SF{YNn=^NU9mLOdKcAstv&GV>r zLxKHPkFxpvE8^r@MSF6UA}cG`#yFL8;kA7ccH9D=BGBtW2;H>C`FjnF^P}(G{wU;G z!LXLCbPfsGeLCQ{Ep$^~)@?v`q(uI`CxBY44osPcq@(rR-633!qa zsyb>?v%@X+e|Mg`+kRL*(;X>^BNZz{_kw5+K;w?#pReiw7eU8_Z^hhJ&fj80XQkuU z39?-z)6Fy$I`bEiMheS(iB6uLmiMd1i)cbK*9iPpl+h4x9ch7x- z1h4H;W_G?|)i`z??KNJVwgfuAM=7&Apd3vm#AT8uzQZ!NII}}@!j)eIfn53h{NmN7 zAKG6SnKP%^k&R~m5#@_4B@V?hYyHkm>0SQ@PPiw*@Tp@UhP-?w@jW?nxXuCipMW=L zH*5l*d@+jXm0tIMP_ec6Jcy6$w(gKK@xBX8@%oPaSyG;13qkFb*LuVx3{AgIyy&n3 z@R2_DcEn|75_?-v5_o~%xEt~ONB>M~tpL!nOVBLPN&e5bn5>+7o0?Nm|EGJ5 zmUbF{u|Qn?cu5}n4@9}g(G1JxtzkKv(tqwm_?1`?YSVA2IS4WI+*(2D*wh&6MIEhw z+B+2U<&E&|YA=3>?^i6)@n1&&;WGHF-pqi_sN&^C9xoxME5UgorQ_hh1__zzR#zVC zOQt4q6>ME^iPJ37*(kg4^=EFqyKH@6HEHXy79oLj{vFqZGY?sVjk!BX^h$SFJlJnv z5uw~2jLpA)|0=tp>qG*tuLru?-u`khGG2)o{+iDx&nC}eWj3^zx|T`xn5SuR;Aw8U z`p&>dJw`F17@J8YAuW4=;leBE%qagVTG5SZdh&d)(#ZhowZ|cvWvGMMrfVsbg>_~! z19fRz8CSJdrD|Rl)w!uznBF&2-dg{>y4l+6(L(vzbLA0Bk&`=;oQQ>(M8G=3kto_) zP8HD*n4?MySO2YrG6fwSrVmnesW+D&fxjfEmp=tPd?RKLZJcH&K(-S+x)2~QZ$c(> zru?MND7_HPZJVF%wX(49H)+~!7*!I8w72v&{b={#l9yz+S_aVPc_So%iF8>$XD1q1 zFtucO=rBj0Ctmi0{njN8l@}!LX}@dwl>3yMxZ;7 z0Ff2oh8L)YuaAGOuZ5`-p%Z4H@H$;_XRJQ|&(MhO78E|nyFa158gAxG^SP(vGi^+< zChY}o(_=ci3Wta#|K6MVljNe0T$%Q5ylx-v`R)r8;3+VUpp-)7T`-Y&{Zk z*)1*2MW+_eOJtF5tCMDV`}jg-R(_IzeE9|MBKl;a7&(pCLz}5<Zf+)T7bgNUQ_!gZtMlw=8doE}#W+`Xp~1DlE=d5SPT?ymu!r4z%&#A-@x^=QfvDkfx5-jz+h zoZ1OK)2|}_+UI)i9%8sJ9X<7AA?g&_Wd7g#rttHZE;J*7!e5B^zdb%jBj&dUDg4&B zMMYrJ$Z%t!5z6=pMGuO-VF~2dwjoXY+kvR>`N7UYfIBMZGP|C7*O=tU z2Tg_xi#Q3S=1|=WRfZD;HT<1D?GMR%5kI^KWwGrC@P2@R>mDT^3qsmbBiJc21kip~ zZp<7;^w{R;JqZ)C4z-^wL=&dBYj9WJBh&rd^A^n@07qM$c+kGv^f+~mU5_*|eePF| z3wDo-qaoRjmIw<2DjMTG4$HP{z54_te_{W^gu8$r=q0JgowzgQPct2JNtWPUsjF8R zvit&V8$(;7a_m%%9TqPkCXYUp&k*MRcwr*24>hR! z$4c#E=PVE=P4MLTUBM z7#*RDe0}=B)(3cvNpOmWa*eH#2HR?NVqXdJ=hq);MGD07JIQQ7Y0#iD!$C+mk7x&B zMwkS@H%>|fmSu#+ zI!}Sb(%o29Vkp_Th>&&!k7O>Ba#Om~B_J{pT7BHHd8(Ede(l`7O#`_}19hr_?~JP9 z`q(`<)y>%)x;O7)#-wfCP{?llFMoH!)ZomgsOYFvZ1DxrlYhkWRw#E-#Qf*z@Y-EQ z1~?_=c@M4DO@8AzZ2hKvw8CgitzI9yFd&N1-{|vP#4IqYb*#S0e3hrjsEGlnc4xwk z4o!0rxpUt8j&`mJ8?+P8G{m^jbk)bo_UPM+ifW*y-A*et`#_Ja_3nYyRa9fAG1Xr5 z>#AM_@PY|*u)DGRWJihZvgEh#{*joJN28uN7;i5{kJ*Gb-TERfN{ERe_~$Es~NJCpdKLRvdj4658uYYx{ng7I<6j~w@p%F<7a(Ssib|j z51;=Py(Nu*#hnLx@w&8X%=jrADn3TW>kplnb zYbFIWWVQXN7%Cwn6KnR)kYePEBmvM45I)UJb$)ninpdYg3a5N6pm_7Q+9>!_^xy?k za8@tJ@OOs-pRAAfT>Nc2x=>sZUs2!9Dwa%TTmDggH4fq(x^MW>mcRyJINlAqK$YQCMgR8`>6=Sg$ zFnJZsA8xUBXIN3i70Q%8px@yQPMgVP=>xcPI38jNJK<=6hC={a07+n@R|$bnhB)X$ z(Zc%tadp70vBTnW{OUIjTMe38F}JIH$#A}PB&RosPyFZMD}q}5W%$rh>5#U;m`z2K zc(&WRxx7DQLM-+--^w*EWAIS%bi>h587qkwu|H=hma3T^bGD&Z!`u(RKLeNZ&pI=q$|HOcji(0P1QC!YkAp*u z3%S$kumxR}jU<@6`;*-9=5-&LYRA<~uFrwO3U0k*4|xUTp4ZY7;Zbjx|uw&BWU$zK(w55pWa~#=f$c zNDW0O68N!xCy>G}(CX=;8hJLxAKn@Aj(dbZxO8a$+L$jK8$N-h@4$i8)WqD_%Snh4 zR?{O%k}>lr>w$b$g=VP8mckcCrjnp>uQl5F_6dPM8FWRqs}h`DpfCv20uZhyY~tr8 zkAYW4#yM;*je)n=EAb(q@5BWD8b1_--m$Q-3wbh1hM{8ihq7UUQfg@)l06}y+#=$( z$x>oVYJ47zAC^>HLRE-!HitjUixP6!R98WU+h>zct7g4eD;Mj#FL*a!VW!v-@b(Jv zj@@xM5noCp5%Vk3vY{tyI#oyDV7<$`KG`tktVyC&0DqxA#>V;-3oH%NW|Q&=UQ&zU zXNIT67J4D%5R1k#bW0F}TD`hlW7b)-=-%X4;UxQ*u4bK$mTAp%y&-(?{sXF%e_VH6 zTkt(X)SSN|;8q@8XX6qfR;*$r#HbIrvOj*-5ND8RCrcw4u8D$LXm5zlj@E5<3S0R# z??=E$p{tOk96$SloZ~ARe5`J=dB|Nj?u|zy2r(-*(q^@YwZiTF@QzQyPx_l=IDKa) zqD@0?IHJqSqZ_5`)81?4^~`yiGh6>7?|dKa8!e|}5@&qV!Iu9<@G?E}Vx9EzomB3t zEbMEm$TKGwkHDpirp;FZD#6P5qIlQJ8}rf;lHoz#h4TFFPYmS3+8(13_Mx2`?^=8S z|0)0&dQLJTU6{b%*yrpQe#OKKCrL8}YKw+<#|m`SkgeoN69TzIBQOl_Yg)W*w?NW) z*WxhEp$zQBBazJSE6ygu@O^!@Fr46j=|K`Mmb~xbggw7<)BuC@cT@Bwb^k?o-A zKX^9AyqR?zBtW5UA#siILztgOp?r4qgC`9jYJG_fxlsVSugGprremg-W(K0{O!Nw-DN%=FYCyfYA3&p*K>+|Q}s4rx#CQK zNj^U;sLM#q8}#|PeC$p&jAjqMu(lkp-_50Y&n=qF9`a3`Pr9f;b`-~YZ+Bb0r~c+V z*JJ&|^T{}IHkwjNAaM^V*IQ;rk^hnnA@~?YL}7~^St}XfHf6OMMCd9!vhk#gRA*{L zp?&63axj|Si%^NW05#87zpU_>QpFNb+I00v@cHwvdBn+Un)n2Egdt~LcWOeBW4Okm zD$-e~RD+W|UB;KQ;a7GOU&%p*efGu2$@wR74+&iP8|6#_fmnh^WcJLs)rtz{46);F z4v0OL{ZP9550>2%FE(;SbM*#sqMl*UXOb>ch`fJ|(*bOZ9=EB1+V4fkQ)hjsm3-u^Pk-4ji_uDDHdD>84tER!MvbH`*tG zzvbhBR@}Yd`azQGavooV=<WbvWLlO#x`hyO34mKcxrGv=`{ssnP=0Be5#1B;Co9 zh{TR>tjW2Ny$ZxJpYeg57#0`GP#jxDCU0!H15nL@@G*HLQcRdcsUO3sO9xvtmUcc{F*>FQZcZ5bgwaS^k-j5mmt zI7Z{Xnoml|A(&_{imAjK!kf5>g(oDqDI4C{;Bv162k8sFNr;!qPa2LPh>=1n z=^_9)TsLDvTqK7&*Vfm5k;VXjBW^qN3Tl&}K=X5)oXJs$z3gk0_+7`mJvz{pK|FVs zHw!k&7xVjvY;|(Py<;J{)b#Yjj*LZO7x|~pO4^MJ2LqK3X;Irb%nf}L|gck zE#55_BNsy6m+W{e zo!P59DDo*s@VIi+S|v93PwY6d?CE=S&!JLXwE9{i)DMO*_X90;n2*mPDrL%{iqN!?%-_95J^L z=l<*{em(6|h7DR4+4G3Wr;4*}yrBkbe3}=p7sOW1xj!EZVKSMSd;QPw>uhKK z#>MlS@RB@-`ULv|#zI5GytO{=zp*R__uK~R6&p$q{Y{iNkg61yAgB8C^oy&``{~FK z8hE}H&nIihSozKrOONe5Hu?0Zy04U#0$fB7C6y~?8{or}KNvP)an=QP&W80mj&8WL zEZQF&*FhoMMG6tOjeiCIV;T{I>jhi9hiUwz?bkX3NS-k5eWKy)Mo_orMEg4sV6R6X&i-Q%JG;Esl+kLpn@Bsls9O|i9z`tKB^~1D5)RIBB&J<6T@a4$pUvh$IR$%ubH)joi z!7>ON0DPwx=>0DA>Bb^c?L8N0BBrMl#oDB+GOXJh;Y&6I)#GRy$W5xK%a;KS8BrER zX)M>Rdoc*bqP*L9DDA3lF%U8Yzb6RyIsW@}IKq^i7v&{LeIc=*ZHIbO68x=d=+0T( zev=DT9f|x!IWZNTB#N7}V4;9#V$%Wo0%g>*!MdLOEU>My0^gni9ocID{$g9ytD!gy zKRWT`DVN(lcYjR|(}f0?zgBa3SwunLfAhx><%u0uFkrdyqlh8_g zDKt#R6rA2(Vm2LW_>3lBNYKG_F{TEnnKWGGC15y&OebIRhFL4TeMR*v9i0wPoK#H< zu4){s4K&K)K(9~jgGm;H7lS7y_RYfS;&!Oj5*eqbvEcW^a*i67nevzOZxN6F+K~A%TYEtsAVsR z@J=1hc#Dgs7J2^FL|qV&#WBFQyDtEQ2kPO7m2`)WFhqAob)Y>@{crkil6w9VoA?M6 zADGq*#-hyEVhDG5MQj677XmcWY1_-UO40QEP&+D)rZoYv^1B_^w7zAvWGw&pQyCyx zD|ga$w!ODOxxGf_Qq%V9Z7Q2pFiUOIK818AGeZ-~*R zI1O|SSc=3Z?#61Rd|AXx2)K|F@Z1@x!hBBMhAqiU)J=U|Y)T$h3D?ZPPQgkSosnN! zIqw-t$0fqsOlgw3TlHJF*t$Q@bg$9}A3X=cS@-yU3_vNG_!#9}7=q7!LZ?-%U26W4 z$d>_}*s1>Ac%3uFR;tnl*fNlylJ)}r2^Q3&@+is3BIv<}x>-^_ng;jhdaM}6Sg3?p z0jS|b%QyScy3OQ(V*~l~bK>VC{9@FMuW_JUZO?y(V?LKWD6(MXzh}M3r3{7b4eB(#`(q1m{>Be%_<9jw8HO!x#yF6vez$c#kR+}s zZO-_;25Sxngd(}){zv?ccbLqRAlo;yog>4LH&uZUK1n>x?u49C)Y&2evH5Zgt~666 z_2_z|H5AO5Iqxv_Bn~*y1qzRPcob<+Otod5Xd2&z=C;u+F}zBB@b^UdGdUz|s!H}M zXG%KiLzn3G?FZgdY&3pV$nSeY?ZbU^jhLz9!t0K?ep}EFNqR1@E!f*n>x*!uO*~JF zW9UXWrVgbX1n#76_;&0S7z}(5n-bqnII}_iDsNqfmye@)kRk`w~1 z6j4h4BxcPe6}v)xGm%=z2#tB#^KwbgMTl2I*$9eY|EWAHFc3tO48Xo5rW z5oHD!G4kb?MdrOHV=A+8ThlIqL8Uu+7{G@ zb)cGBm|S^Eh5= z^E^SZ=yeC;6nNCdztw&TdnIz}^Of@Ke*@vjt)0g>Y!4AJvWiL~e7+9#Ibhe)> ziNwh>gWZL@FlWc)wzihocz+%+@*euwXhW%Hb>l7tf8aJe5_ZSH1w-uG|B;9qpcBP0 zM`r1Hu#htOl)4Cl1c7oY^t0e4Jh$-I(}M5kzWqh{F=g&IM#JiC`NDSd@BCKX#y<P@Gwl$3a3w z6<(b|K(X5FIR22M)sy$4jY*F4tT{?wZRI+KkZFb<@j@_C316lu1hq2hA|1wCmR+S@ zRN)YNNE{}i_H`_h&VUT5=Y(lN%m?%QX;6$*1P}K-PcPx>*S55v)qZ@r&Vcic-sjkm z! z=nfW&X`}iAqa_H$H%z3Tyz5&P3%+;93_0b;zxLs)t#B|up}JyV$W4~`8E@+BHQ+!y zuIo-jW!~)MN$2eHwyx-{fyGjAWJ(l8TZtUp?wZWBZ%}krT{f*^fqUh+ywHifw)_F> zp76_kj_B&zFmv$FsPm|L7%x-j!WP>_P6dHnUTv!9ZWrrmAUteBa`rT7$2ixO;ga8U z3!91micm}{!Btk+I%pMgcKs?H4`i+=w0@Ws-CS&n^=2hFTQ#QeOmSz6ttIkzmh^`A zYPq)G1l3h(E$mkyr{mvz*MP`x+PULBn%CDhltKkNo6Uqg!vJ#DA@BIYr9TQ`18Un2 zv$}BYzOQuay9}w(?JV63F$H6WmlYPPpH=R|CPb%C@BCv|&Q|&IcW7*LX?Q%epS z`=CPx{1HnJ9_46^=0VmNb>8JvMw-@&+V8SDLRYsa>hZXEeRbtf5eJ>0@Ds47zIY{N z42EOP9J8G@MXXdeiPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?lu1NER9Fe^SItioK@|V(ZWmgL zZT;XwPgVuWM>O%^|Dc$VK;n&?9!&g5)aVsG8cjs5UbtxVVnQNOV~7Mrg3+jnU;rhE z6fhW6P)R>_eXrXo-RW*y6RQ_qcb^s1wTu$TwriZ`=JUws>vRi}5x}MW1MR#7p|gIWJlaLK;~xaN}b< z<-@=RX-%1mt`^O0o^~2=CD7pJ<<$Rp-oUL-7PuG>do^5W_Mk#unlP}6I@6NPxY`Q} zuXJF}!0l)vwPNAW;@5DjPRj?*rZxl zwn;A(cFV!xe^CUu+6SrN?xe#mz?&%N9QHf~=KyK%DoB8HKC)=w=3E?1Bqj9RMJs3U z5am3Uv`@+{jgqO^f}Lx_Jp~CoP3N4AMZr~4&d)T`R?`(M{W5WWJV^z~2B|-oih@h^ zD#DuzGbl(P5>()u*YGo*Och=oRr~3P1wOlKqI)udc$|)(bacG5>~p(y>?{JD7nQf_ z*`T^YL06-O>T(s$bi5v~_fWMfnE7Vn%2*tqV|?~m;wSJEVGkNMD>+xCu#um(7}0so zSEu7?_=Q64Q5D+fz~T=Rr=G_!L*P|(-iOK*@X8r{-?oBlnxMNNgCVCN9Y~ocu+?XA zjjovJ9F1W$Nf!{AEv%W~8oahwM}4Ruc+SLs>_I_*uBxdcn1gQ^2F8a*vGjgAXYyh? zWCE@c5R=tbD(F4nL9NS?$PN1V_2*WR?gjv3)4MQeizuH`;sqrhgykEzj z593&TGlm3h`sIXy_U<7(dpRXGgp0TB{>s?}D{fwLe>IV~exweOfH!qM@CV5kib!YA z6O0gvJi_0J8IdEvyP#;PtqP*=;$iI2t(xG2YI-e!)~kaUn~b{6(&n zp)?iJ`z2)Xh%sCV@BkU`XL%_|FnCA?cVv@h*-FOZhY5erbGh)%Q!Av#fJM3Csc_g zC2I6x%$)80`Tkz#KRA!h1FzY`?0es3t!rKDT5EjPe6B=BLPr7s0GW!if;Ip^!AmGW zL;$`Vdre+|FA!I4r6)keFvAx3M#1`}ijBHDzy)3t0gwjl|qC2YB`SSxFKHr(oY#H$)x{L$LL zBdLKTlsOrmb>T0wd=&6l3+_Te>1!j0OU8%b%N342^opKmT)gni(wV($s(>V-fUv@0p8!f`=>PxC|9=nu ze{ToBBj8b<{PLfXV$h8YPgA~E!_sF9bl;QOF{o6t&JdsX?}rW!_&d`#wlB6T_h;Xf zl{4Tz5>qjF4kZgjO7ZiLPRz_~U@k5%?=30+nxEh9?s78gZ07YHB`FV`4%hlQlMJe@J`+e(qzy+h(9yY^ckv_* zb_E6o4p)ZaWfraIoB2)U7_@l(J0O%jm+Or>8}zSSTkM$ASG^w3F|I? z$+eHt7T~04(_WfKh27zqS$6* zzyy-ZyqvSIZ0!kkSvHknm_P*{5TKLQs8S6M=ONuKAUJWtpxbL#2(_huvY(v~Y%%#~ zYgsq$JbLLprKkV)32`liIT$KKEqs$iYxjFlHiRNvBhxbDg*3@Qefw4UM$>i${R5uB zhvTgmqQsKA{vrKN;TSJU2$f9q=y{$oH{<)woSeV>fkIz6D8@KB zf4M%v%f5U2?<8B(xn}xV+gWP?t&oiapJhJbfa;agtz-YM7=hrSuxl8lAc3GgFna#7 zNjX7;`d?oD`#AK+fQ=ZXqfIZFEk{ApzjJF0=yO~Yj{7oQfXl+6v!wNnoqwEvrs81a zGC?yXeSD2NV!ejp{LdZGEtd1TJ)3g{P6j#2jLR`cpo;YX}~_gU&Gd<+~SUJVh+$7S%`zLy^QqndN<_9 zrLwnXrLvW+ew9zX2)5qw7)zIYawgMrh`{_|(nx%u-ur1B7YcLp&WFa24gAuw~& zKJD3~^`Vp_SR$WGGBaMnttT)#fCc^+P$@UHIyBu+TRJWbcw4`CYL@SVGh!X&y%!x~ zaO*m-bTadEcEL6V6*{>irB8qT5Tqd54TC4`h`PVcd^AM6^Qf=GS->x%N70SY-u?qr>o2*OV7LQ=j)pQGv%4~z zz?X;qv*l$QSNjOuQZ>&WZs2^@G^Qas`T8iM{b19dS>DaXX~=jd4B2u`P;B}JjRBi# z_a@&Z5ev1-VphmKlZEZZd2-Lsw!+1S60YwW6@>+NQ=E5PZ+OUEXjgUaXL-E0fo(E* zsjQ{s>n33o#VZm0e%H{`KJi@2ghl8g>a~`?mFjw+$zlt|VJhSU@Y%0TWs>cnD&61fW4e0vFSaXZa4-c}U{4QR8U z;GV3^@(?Dk5uc@RT|+5C8-24->1snH6-?(nwXSnPcLn#X_}y3XS)MI_?zQ$ZAuyg+ z-pjqsw}|hg{$~f0FzmmbZzFC0He_*Vx|_uLc!Ffeb8#+@m#Z^AYcWcZF(^Os8&Z4g zG)y{$_pgrv#=_rV^D|Y<_b@ICleUv>c<0HzJDOsgJb#Rd-Vt@+EBDPyq7dUM9O{Yp zuGUrO?ma2wpuJuwl1M=*+tb|qx7Doj?!F-3Z>Dq_ihFP=d@_JO;vF{iu-6MWYn#=2 zRX6W=`Q`q-+q@Db|6_a1#8B|#%hskH82lS|9`im0UOJn?N#S;Y0$%xZw3*jR(1h5s z?-7D1tnIafviko>q6$UyqVDq1o@cwyCb*})l~x<@s$5D6N=-Uo1yc49p)xMzxwnuZ zHt!(hu-Ek;Fv4MyNTgbW%rPF*dB=;@r3YnrlFV{#-*gKS_qA(G-~TAlZ@Ti~Yxw;k za1EYyX_Up|`rpbZ0&Iv#$;eC|c0r4XGaQ-1mw@M_4p3vKIIpKs49a8Ns#ni)G314Z z8$Ei?AhiT5dQGWUYdCS|IC7r z=-8ol>V?u!n%F*J^^PZ(ONT&$Ph;r6X;pj|03HlDY6r~0g~X#zuzVU%a&!fs_f|m?qYvg^Z{y?9Qh7Rn?T*F%7lUtA6U&={HzhYEzA`knx1VH> z{tqv?p@I(&ObD5L4|YJV$QM>Nh-X3cx{I&!$FoPC_2iIEJfPk-$;4wz>adRu@n`_y z_R6aN|MDHdK;+IJmyw(hMoDCFCQ(6?hCAG5&7p{y->0Uckv# zvooVuu04$+pqof777ftk<#42@KQ((5DPcSMQyzGOJ{e9H$a9<2Qi_oHjl{#=FUL9d z+~0^2`tcvmp0hENwfHR`Ce|<1S@p;MNGInXCtHnrDPXCKmMTZQ{HVm_cZ>@?Wa6}O zHsJc7wE)mc@1OR2DWY%ZIPK1J2p6XDO$ar`$RXkbW}=@rFZ(t85AS>>U0!yt9f49^ zA9@pc0P#k;>+o5bJfx0t)Lq#v4`OcQn~av__dZ-RYOYu}F#pdsl31C^+Qgro}$q~5A<*c|kypzd} ziYGZ~?}5o`S5lw^B{O@laad9M_DuJle- z*9C7o=CJh#QL=V^sFlJ0c?BaB#4bV^T(DS6&Ne&DBM_3E$S^S13qC$7_Z?GYXTpR@wqr70wu$7+qvf-SEUa5mdHvFbu^7ew!Z1a^ zo}xKOuT*gtGws-a{Tx}{#(>G~Y_h&5P@Q8&p!{*s37^QX_Ibx<6XU*AtDOIvk|^{~ zPlS}&DM5$Ffyu-T&0|KS;Wnaqw{9DB&B3}vcO14wn;)O_e@2*9B&0I_ zZz{}CMxx`hv-XouY>^$Y@J(_INeM>lIQI@I>dBAqq1)}?Xmx(qRuX^i4IV%=MF306 z9g)i*79pP%_7Ex?m6ag-4Tlm=Z;?DQDyC-NpUIb#_^~V_tsL<~5<&;Gf2N+p?(msn zzUD~g>OoW@O}y0@Z;RN)wjam`CipmT&O7a|YljZqU=U86 zedayEdY)2F#BJ6xvmW8K&ffdS*0!%N<%RB!2~PAT4AD*$W7yzHbX#Eja9%3aD+Ah2 zf#T;XJW-GMxpE=d4Y>}jE=#U`IqgSoWcuvgaWQ9j1CKzG zDkoMDDT)B;Byl3R2PtC`ip=yGybfzmVNEx{xi_1|Cbqj>=FxQc{g`xj6fIfy`D8fA z##!-H_e6o0>6Su&$H2kQTujtbtyNFeKc}2=|4IfLTnye#@$Au7Kv4)dnA;-fz@D_8 z)>irG$)dkBY~zX zC!ZXLy*L3xr6cb70QqfN#Q>lFIc<>}>la4@3%7#>a1$PU&O^&VszpxLC%*!m-cO{B z-Y}rQr4$84(hvy#R69H{H zJ*O#uJh)TF6fbXy;fZkk%X=CjsTK}o5N1a`d7kgYYZLPxsHx%9*_XN8VWXEkVJZ%A z1A+5(B;0^{T4aPYr8%i@i32h)_)|q?9vws)r+=5u)1YNftF5mknwfd*%jXA2TeP}Z zQ!m?xJ3?9LpPM?_A3$hQ1QxNbR&}^m z!F999s?p^ak#C4NM_x2p9FoXWJ$>r?lJ)2bG)sX{gExgLA2s5RwHV!h6!C~d_H||J z>9{E{mEv{Z1z~65Vix@dqM4ZqiU|!)eWX$mwS5mLSufxbpBqqS!jShq1bmwCR6 z4uBri7ezMeS6ycaXPVu(i2up$L; zjpMtB`k~WaNrdgM_R=e#SN?Oa*u%nQy01?()h4A(jyfeNfx;5o+kX?maO4#1A^L}0 zYNyIh@QVXIFiS0*tE}2SWTrWNP3pH}1Vz1;E{@JbbgDFM-_Mky^7gH}LEhl~Ve5PexgbIyZ(IN%PqcaV@*_`ZFb=`EjspSz%5m2E34BVT)d=LGyHVz@-e%9Ova*{5@RD;7=Ebkc2GP%pIP^P7KzKapnh`UpH?@h z$RBpD*{b?vhohOKf-JG3?A|AX|2pQ?(>dwIbWhZ38GbTm4AImRNdv_&<99ySX;kJ| zo|5YgbHZC#HYgjBZrvGAT4NZYbp}qkVSa;C-LGsR26Co+i_HM&{awuO9l)Ml{G8zD zs$M8R`r+>PT#Rg!J(K6T4xHq7+tscU(}N$HY;Yz*cUObX7J7h0#u)S7b~t^Oj}TBF zuzsugnst;F#^1jm>22*AC$heublWtaQyM6RuaquFd8V#hJ60Z3j7@bAs&?dD#*>H0SJaDwp%U~27>zdtn+ z|8sZzklZy$%S|+^ie&P6++>zbrq&?+{Yy11Y>@_ce@vU4ZulS@6yziG6;iu3Iu`M= zf3rcWG<+3F`K|*(`0mE<$89F@jSq;j=W#E>(R}2drCB7D*0-|D;S;(;TwzIJkGs|q z2qH{m_zZ+el`b;Bv-#bQ>}*VPYC|7`rgBFf2oivXS^>v<&HHTypvd4|-zn|=h=TG{ z05TH2+{T%EnADO>3i|CB zCu60#qk`}GW{n4l-E$VrqgZGbI zbQW690KgZt4U3F^5@bdO1!xu~p@7Y~*_FfWg2CdvED5P5#w#V46LH`<&V0{t&Ml~4 zHNi7lIa+#i+^Z6EnxO7KJQw)wD)4~&S-Ki8)3=jpqxmx6c&zU&<&h%*c$I(5{1HZT zc9WE}ijcWJiVa^Q^xC|WX0habl89qycOyeViIbi(LFsEY_8a|+X^+%Qv+W4vzj>`y zpuRnjc-eHNkvXvI_f{=*FX=OKQzT?bck#2*qoKTHmDe>CDb&3AngA1O)1b}QJ1Tun z_<@yVEM>qG7664Pa@dzL@;DEh`#?yM+M|_fQS<7yv|i*pw)|Z8)9IR+QB7N3v3K(wv4OY*TXnH&X0nQB}?|h2XQeGL^q~N7N zDFa@x0E(UyN7k9g%IFq7Sf+EAfE#K%%#`)!90_)Dmy3Bll&e1vHQyPA87TaF(xbqMpDntVp?;8*$87STop$!EAnGhZ?>mqPJ(X zFsr336p3P{PpZCGn&^LP(JjnBbl_3P3Kcq+m}xVFMVr1zdCPJMDIV_ki#c=vvTwbU z*gKtfic&{<5ozL6Vfpx>o2Tts?3fkhWnJD&^$&+Mh5WGGyO7fG@6WDE`tEe(8<;+q z@Ld~g08XDzF8xtmpIj`#q^(Ty{Hq>t*v`pedHnuj(0%L(%sjkwp%s}wMd!a<*L~9T z9MM@s)Km~ogxlqEhIw5(lc46gCPsSosUFsgGDr8H{mj%OzJz{N#;bQ;KkV+ZWA1(9 zu0PXzyh+C<4OBYQ0v3z~Lr;=C@qmt8===Ov2lJ1=DeLfq*#jgT{YQCuwz?j{&3o_6 zsqp2Z_q-YWJg?C6=!Or|b@(zxTlg$ng2eUQzuC<+o)k<6^9ju_Z*#x+oioZ5T8Z_L zz9^A1h2eFS0O5muq8;LuDKwOv4A9pxmOjgb6L*i!-(0`Ie^d5Fsgspon%X|7 zC{RRXEmYn!5zP9XjG*{pLa)!2;PJB2<-tH@R7+E1cRo=Wz_5Ko8h8bB$QU%t9#vol zAoq?C$~~AsYC|AQQ)>>7BJ@{Cal)ZpqE=gjT+Juf!RD-;U0mbV1ED5PbvFD6M=qj1 zZ{QERT5@(&LQ~1X9xSf&@%r|3`S#ZCE=sWD`D4YQZ`MR`G&s>lN{y2+HqCfvgcw3E z-}Kp(dfGG?V|97kAHQX+OcKCZS`Q%}HD6u*e$~Ki&Vx53&FC!x94xJd4F2l^qQeFO z?&JdmgrdVjroKNJx64C!H&Vncr^w zzR#XI}Dn&o8jB~_YlVM^+#0W(G1LZH5K^|uYT@KSR z^Y5>^*Bc45E1({~EJB(t@4n9gb-eT#s@@7)J^^<_VV`Pm!h7av8XH6^5zO zOcQBhTGr;|MbRsgxCW69w{bl4EW#A~);L?d4*y#j8Ne=Z@fmJP0k4{_cQ~KA|Y#_#BuUiYx8y*za3_6Y}c=GSe7(2|KAfhdzud!Zq&}j)=o4 z7R|&&oX7~e@~HmyOOsCCwy`AR+deNjZ3bf6ijI_*tKP*_5JP3;0d;L_p(c>W1b%sG zJ*$wcO$ng^aW0E(5ldckV9unU7}OB7s?Wx(761?1^&8tA5y0_(ieV>(x-e@}1`lWC z-YH~G$D>#ud!SxK2_Iw{K%92=+{4yb-_XC>ji&j7)1ofp(OGa4jjF;Hd*`6YQL+Jf zffg+6CPc8F@EDPN{Kn96yip;?g@)qgkPo^nVKFqY?8!=h$G$V=<>%5J&iVjwR!7H0 z$@QL|_Q81I;Bnq8-5JyNRv$Y>`sWl{qhq>u+X|)@cMlsG!{*lu?*H`Tp|!uv z9oEPU1jUEj@ueBr}%Y)7Luyi)REaJV>eQ{+uy4uh0ep0){t;OU8D*RZ& zE-Z-&=BrWQLAD^A&qut&4{ZfhqK1ZQB0fACP)=zgx(0(o-`U62EzTkBkG@mXqbjXm z>w`HNeQM?Is&4xq@BB(K;wv5nI6EXas)XXAkUuf}5uSrZLYxRCQPefn-1^#OCd4aO zzF=dQ*CREEyWf@n6h7(uXLNgJIwGp#Xrsj6S<^bzQ7N0B0N{XlT;`=m9Olg<>KL}9 zlp>EKTx-h|%d1Ncqa=wnQEuE;sIO-f#%Bs?g4}&xS?$9MG?n$isHky0caj za8W+B^ERK#&h?(x)7LLpOqApV5F>sqB`sntV%SV>Q1;ax67qs+WcssfFeF3Xk=e4^ zjR2^(%K1oBq%0%Rf!y&WT;lu2Co(rHi|r1_uW)n{<7fGc-c=ft7Z0Q}r4W$o$@tQF#i?jDBwZ8h+=SC}3?anUp3mtRVv9l#H?-UD;HjTF zQ*>|}e=6gDrgI9p%c&4iMUkQa4zziS$bO&i#DI$Wu$7dz7-}XLk%!US^XUIFf2obO zFCTjVEtkvYSKWB;<0C;_B{HHs~ax_48^Cml*mjfBC5*7^HJZiLDir(3k&BerVIZF8zF;0q80eX8c zPN4tc+Dc5DqEAq$Y3B3R&XPZ=AQfFMXv#!RQnGecJONe0H;+!f^h5x0wS<+%;D}MpUbTNUBA}S2n&U59-_5HKr{L^jPsV8B^%NaH|tUr)mq=qCBv_- ziZ1xUp(ZzxUYTCF@C}To;u60?RIfTGS?#JnB8S8@j`TKPkAa)$My+6ziGaBcA@){d z91)%+v2_ba7gNecdj^8*I4#<11l!{XKl6s0zkXfJPxhP+@b+5ev{a>p*W-3*25c&} zmCf{g9mPWVQ$?Sp*4V|lT@~>RR)9iNdN^7KT@>*MU3&v^3e?=NTbG9!h6C|9zO097 zN{Qs6YwR-5$)~ z`b~qs`a1Dbx8P>%V=1XGjBptMf%P~sl1qbHVm1HYpY|-Z^Dar8^HqjIw}xaeRlsYa zJ_@Apy-??`gxPmb`m`0`z`#G7*_C}qiSZe~l2z65tE~IwMw$1|-u&t|z-8SxliH00 zlh1#kuqB56s+E&PWQ7Nz17?c}pN+A@-c^xLqh(j;mS|?>(Pf7(?qd z5q@jkc^nA&!K-}-1P=Ry0yyze0W!+h^iW}7jzC1{?|rEFFWbE^Yu7Y}t?jmP-D$f+ zmqFT7nTl0HL|4jwGm7w@a>9 zKD)V~+g~ysmei$OT5}%$&LK8?ib|8aY|>W3;P+0B;=oD=?1rg+PxKcP(d;OEzq1CKA&y#boc51P^ZJPPS)z5 zAZ)dd2$glGQXFj$`XBBJyl2y-aoBA8121JC9&~|_nY>nkmW>TLi%mWdn-^Jks-Jv| zSR*wij;A3Fcy8KsDjQ15?Z9oOj|Qw2;jgJiq>dxG(2I2RE- z$As!#zSFIskebqU2bnoM^N<4VWD2#>!;saPSsY8OaCCQqkCMdje$C?Sp%V}f2~tG5 z0whMYk6tcaABwu*x)ak@n4sMElGPX1_lmv@bgdI2jPdD|2-<~Jf`L`@>Lj7{<-uLQ zE3S_#3e10q-ra=vaDQ42QUY^@edh>tnTtpBiiDVUk5+Po@%RmuTntOlE29I4MeJI?;`7;{3e4Qst#i-RH6s;>e(Sc+ubF2_gwf5Qi%P!aa89fx6^{~A*&B4Q zKTF|Kx^NkiWx=RDhe<{PWXMQ;2)=SC=yZC&mh?T&CvFVz?5cW~ritRjG2?I0Av_cI z)=s!@MXpXbarYm>Kj0wOxl=eFMgSMc?62U#2gM^li@wKPK9^;;0_h7B>F>0>I3P`{ zr^ygPYp~WVm?Qbp6O3*O2)(`y)x>%ZXtztz zMAcwKDr=TCMY!S-MJ8|2MJCVNUBI0BkJV6?(!~W!_dC{TS=eh}t#X+2D>Kp&)ZN~q zvg!ogxUXu^y(P*;Q+y_rDoGeSCYxkaGPldDDx)k;ocJvvGO#1YKoQLHUf2h_pjm&1 zqh&!_KFH03FcJvSdfgUYMp=5EpigZ*8}7N_W%Ms^WSQ4hH`9>3061OEcxmf~TcYn5_oHtscWn zo5!ayj<_fZ)vHu3!A!7M;4y1QIr8YGy$P2qDD_4+T8^=^dB6uNsz|D>p~4pF3Nrb6 zcpRK*($<~JUqOya#M1=#IhOZ zG)W+rJS-x(6EoVz)P zsSo>JtnChdj9^);su%SkFG~_7JPM zEDz3gk2T7Y%x>1tWyia|op(ilEzvAujW?Xwlw>J6d7yEi8E zv30riR|a_MM%ZZX&n!qm0{2agq(s?x9E@=*tyT$nND+{Djpm7Rsy!+c$j+wqMwTOF zZL8BQ|I`<^bGW)5apO{lh(Asqen?_U`$_n0-Ob~Yd%^89oEe%9yGumQ_8Be+l2k+n zCxT%s?bMpv|AdWP7M1LQwLm|x+igA~;+iK-*+tClF&ueX_V}>=4gvZ01xpubQWXD_ zi?Un>&3=$fu)dgk-Z;0Ll}HK5_YM->l^Czrd0^cJ))(DwL2g3aZuza7ga9^|mT_70 z))}A}r1#-(9cxtn<9jGRwOB4hb9kK@YCgjfOM-90I$8@l=H^`K$cyhe2mTM|FY9vW znH~h)I<_aa#V1xmhk?Ng@$Jw-s%a!$BI4Us+Df+?J&gKAF-M`v}j`OWKP3>6`X`tEmhe#y*(Xm$_^Ybbs=%;L7h zp7q^C*qM}Krqsinq|WolR99>_!GL#Z71Hhz|IwQQv<>Ds09B?Je(lhI1(FInO8mc} zl$RyKCUmfku+Cd^8s0|t+e}5g7M{ZPJQH=UB3(~U&(w#Bz#@DTDHy>_UaS~AtN>4O zJ-I#U@R($fgupHebcpuEBX`SZ>kN!rW$#9>s{^3`86ZRQRtYTY)hiFm_9wU3c`SC8 z-5M%g)h}3Pt|wyj#F%}pGC@VL`9&>9P+_UbudCkS%y2w&*o})hBplrB*@Z?gel5q+ z%|*59(sR9GMk3xME}wd%&k?7~J)OL`rK#4d-haC7uaU8-L@?$K6(r<0e<;y83rK&` z3Q!1rD9WkcB8WBQ|WT|$u^lkr0UL4WH4EQTJyk@5gzHb18cOte4w zS`fLv8q;PvAZyY;*Go3Qw1~5#gP0D0ERla6M6#{; zr1l?bR}Nh+OC7)4bfAs(0ZD(axaw6j9v`^jh5>*Eo&$dAnt?c|Y*ckEORIiJXfGcM zEo`bmIq6rJm`XhkXR-^3d8^RTK2;nmVetHfUNugJG(4XLOu>HJA;0EWb~?&|0abr6 zxqVp@p=b3MN^|~?djPe!=eex(u!x>RYFAj|*T$cTi*Sd3Bme7Pri1tkK9N`KtRmXf zZYNBNtik97ct1R^vamQBfo9ZUR@k*LhIg8OR9d_{iv#t)LQV91^5}K5u{eyxwOFoU zHMVq$C>tfa@uNDW^_>EmO~WYQd(@!nKmAvSSIb&hPO|}g-3985t?|R&WZXvxS}Kt2i^eRe>WHb_;-K5cM4=@AN1>E&1c$k!w4O*oscx(f=<1K6l#8Exi)U(ZiZ zdr#YTP6?m1e1dOKysUjQ^>-MR={OuD00g6+(a^cvcmn#A_%Fh3Of%(qP5nvjS1=(> z|Ld8{u%(J}%2SY~+$4pjy{()5HN2MYUjg1X9umxOMFFPdM+IwOVEs4Z(olynvT%G) zt9|#VR}%O2@f6=+6uvbZv{3U)l;C{tuc zZ{K$rut=eS%3_~fQv^@$HV6#9)K9>|0qD$EV2$G^XUNBLM|5-ZmFF!KV)$4l^KVj@ zZ4fI}Knv*K%zPqK77}B-h_V{66VrmoZP2>@^euu8Rc}#qwRwt5uEBWcJJE5*5rT2t zA4Jpx`QQ~1Sh_n_a9x%Il!t1&B~J6p54zxAJx`REov${jeuL8h8x-z=?qwMAmPK5i z_*ES)BW(NZluu#Bmn1-NUKQip_X&_WzJy~J`WYxEJQ&Gu7DD< z&F9urE;}8S{x4{yB zaq~1Zrz%8)<`prSQv$eu5@1RY2WLu=waPTrn`WK%;G5(jt^FeM;gOdvXQjYhax~_> z{bS_`;t#$RYMu-;_Dd&o+LD<5Afg6v{NK?0d8dD5ohAN?QoocETBj?y{MB)jQ%UQ}#t3j&iL!qr@#6JEajR3@^k5wgLfI9S9dT2^f`2wd z%I#Q*@Ctk@w=(u)@QC}yBvUP&fFRR-uYKJ){Wp3&$s(o~W7OzgsUIPx0|ph2L1(r*_Pa@T@mcH^JxBjh09#fgo|W#gG7}|)k&uD1iZxb0 z@|Y)W79SKj9sS&EhmTD;uI#)FE6VwQ*YAr&foK$RI5H8_ripb$^=;U%gWbrrk4!5P zXDcyscEZoSH~n6VJu8$^6LE6)>+=o#Q-~*jmob^@191+Ot1w454e3)WMliLtY6~^w zW|n#R@~{5K#P+(w+XC%(+UcOrk|yzkEes=!qW%imu6>zjdb!B#`efaliKtN}_c!Jp zfyZa`n+Nx8;*AquvMT2;c8fnYszdDA*0(R`bsof1W<#O{v%O!1IO4WZe=>XBu_D%d zOwWDaEtX%@B>4V%f1+dKqcXT>m2!|&?}(GK8e&R=&w?V`*Vj)sCetWp9lr@@{xe6a zE)JL&;p}OnOO}Nw?vFyoccXT*z*?r}E8{uPtd;4<(hmX;d$rqJhEF}I+kD+m(ke;J z7Cm$W*CSdcD=RYEBhedg>tuT{PHqwCdDP*NkHv4rvQTXkzEn*Mb0oJz&+WfWIOS4@ zzpPJ|e%a-PIwOaOC7uQcHQ-q(SE(e@fj+7oC@34wzaBNaP;cw&gm{Z8yYX?V(lIv5 zKbg*zo1m5aGA4^lwJ|bAU=j3*d8S{vp!~fLFcK8s6%Ng55_qW_d*3R%e=34aDZPfD z&Le39j|ahp6E7B0*9OVdeMNrTErFatiE+=Z!XZ^tv0y%zZKXRTBuPyP&C{5(H?t)S zKV24_-TKpOmCPzU&by8R1Q5HY^@IDoeDA9MbgizgQ*F1Er~HVmvSU>vx}pZVQ&tr| zOtZl8vfY2#L<)gZ=ba&wG~EI*Vd?}lRMCf+!b5CDz$8~be-HKMo5omk$w7p4`Mym*IR8WiTz4^kKcUo^8Hkcsu14u z`Pkg`#-Y^A%CqJ0O@UF|caAulf68@(zhqp~YjzInh7qSN7Ov%Aj(Qz%{3zW|xubJ- ztNE_u_MO7Q_585r;xD?e=Er}@U1G@BKW5v$UM((eByhH2p!^g9W}99OD8VV@7d{#H zv)Eam+^K(5>-Ot~U!R$Um3prQmM)7DyK=iM%vy>BRX4#aH7*oCMmz07YB(EL!^%F7?CA#>zXqiYDhS;e?LYPTf(bte6B ztrfvDXYG*T;ExK-w?Knt{jNv)>KMk*sM^ngZ-WiUN;=0Ev^GIDMs=AyLg2V@3R z7ugNc45;4!RPxvzoT}3NCMeK$7j#q3r_xV(@t@OPRyoKBzHJ#IepkDsm$EJRxL)A* zf{_GQYttu^OXr$jHQn}zs$Eh|s|Z!r?Yi+bS-bi+PE*lH zo|6ztu6$r_?|B~S#m>imI!kQP9`6X426uHRri!wGcK;J;`%sFM(D#*Le~W*t2uH`Q z(HEO9-c_`mhA@4QhbW+tgtt9Pzx=_*3Kh~TB$SKmU4yx-Ay&)n%PZPKg#rD4H{%Ke zdMY@rf5EAFfqtrf?Vmk&N(_d-<=bvfOdPrYwY*;5%j@O6@O#Qj7LJTk-x3LN+dEKy+X z>~U8j3Ql`exr1jR>+S4nEy+4c2f{-Q!3_9)yY758tLGg7k^=nt<6h$YE$ltA+13S<}uOg#XHe6 zZHKdNsAnMQ_RIuB;mdoZ%RWpandzLR-BnjN2j@lkBbBd+?i ze*!5mC}!Qj(Q!rTu`KrRRqp22c=hF6<^v&iCDB`n7mHl;vdclcer%;{;=kA(PwdGG zdX#BWoC!leBC4);^J^tPkPbIe<)~nYb6R3u{HvC!NOQa?DC^Q`|_@ zcz;rk`a!4rSLAS>_=b@g?Yab4%=J3Cc7pRv8?_rHMl_aK*HSPU%0pG2Fyhef_biA!aW|-(( z*RIdG&Lmk(=(nk28Q1k1Oa$8Oa-phG%Mc6dT3>JIylcMMIc{&FsBYBD^n@#~>C?HG z*1&FpYVvXOU@~r2(BUa+KZv;tZ15#RewooEM0LFb>guQN;Z0EBFMFMZ=-m$a3;gVD z)2EBD4+*=6ZF?+)P`z@DOT;azK0Q4p4>NfwDR#Pd;no|{q_qB!zk1O8QojE;>zhPu z1Q=1z^0MYHo1*``H3ex|bW-Zy==5J4fE2;g6sq6YcXMYK5i|S^9(OSw#v!3^!EB<% zZF~J~CleS`V-peStyf*I%1^R88D;+8{{qN6-t!@gTARDg^w2`uSzFZbPQ!)q^oC}m zPo8VOQxq2BaIN`pAVFGu8!{p3}(+iZ`f4ck2ygVpEZMQW38nLpj3NQx+&sAkb8`}P3- zc>N*k6AG?r}bfO6_vccTuKX+*- z7W4Q#2``P0jIHYs)F>uG#AM#I6W2)!Nu2nD5{CRV_PmkDS2ditmbd#pggqEgAo%5oC?|CP zGa0CV)wA*ko!xC7pZYkqo{10CN_e00FX5SjWkI3?@XG}}bze!(&+k2$C-C`6temSk z_YyYpB^wh3woo`B zrMSTd4T?(X-jh`FeO76C(3xsOm9s2BP_b%ospg^!#*2*o9N;tf4(X9$qc_d(()yz5 zDk@1}u_Xd+86vy5RBs?LQCuYKCGPS;E4uFOi@V%1JTK&|eRf~lp$AV#;*#O}iRI2=i3rFL8{ zA^ptDZ0l6k-mq=hUJ0x$Y@J>UNfz~I5l63H(`~*v;qX`Z{zwsQQD-!wp0D&hyB8&Z z7$R07gIKGJ^%AvQ{4KM0edM39iFRx=P^6`!<1(s0t|JbB2tXs_B_IH9#ajH0C=-n+ z`nz`fKMBKLlf?2AC+|83M+0rqR%uhNGD;uKA6jOjp7YDe^4%0fRB<^bcjlS2KF~F; zu09wh1x0&4pG&76M;x8$u`b134t=dEPBn6PV|X29<#T4F1mxGF*HOgiWU8tN@cguI z_F@o+XL7FJztR63wC|j4x_DANzcX94r7Iz-O2x$({&qd*mdLG=-Rv)uZ}UlMR+F&q zU}=lkfb0p1>1Ho){o$@}mSKIV;h*$AND7~Dl)QzpFBlSM99Kx+F7GsVK5xcR? z_4Q(Z%cgk8ST}U;;=!LwyZVu^S$>B-Waeik%wzcKTIqeX=0FP(TGQ=nxi=dsS5BYF zl@?}NT!Y!Iyos^@v7XWXA{_bV~1lxz7gC?xuXxy0_?GaN!AhRRM5>)^t%&ODd;@HN5L{MD3 zc>i2keQZVm#?NrDwbfd}_<*5^U&w0zv~n-y8=GGN-!=_`FU^cM8oVCWRFxw?BM^YD zi=Vxz4q|jwPTg+?q7_XI)-S@gQkh>w0ZUB}a{^ z_i;`Y(~fvpI!vmW*A^|P7(6+@C4UeL2WATf{P1?H5rk`5{TL zcf!CgP6Mi{MvjZS)rfo7JLDZK7M7ANd$3`{j9baD*7{#Zu-33fOYUzjvtKzR2)_T1I1s7fe&z|=)QkX;=`zX8!Byw-veM#yr;|wjO^II>!B*B z0+w%;0(=*G3V@88t!}~zx)&do(uF=073Yeh*fEhZb3Vn>t!m(9p~Y_FdV3IgR)9eT z)~e9xpI%2deTWyHlXA(7srrfc_`7ACm!R>SoIgkuF8 z!wkOhrixFy9y@)GdxAntd!!7@=L_tFD2T5OdSUO)I%yj02le`qeQ=yKq$g^h)NG;# za(0J@#VBi^5YI|QI=rq{KlxwGabZJ0dKmfWDROkcM}lUN$@DV`K7fU?8CP2H23QPi zG?YF*=Vn=kTK*#Y_{AQN&oLju|0#E=fx%YVh>S{puu&K$b;BN*jIo@VYhqPiJPzzM>#kxoy0vW9i;ne2_BIG0zyRFp<3M(iY(%*M_>q0ulV2K}Tg zkG{EWKS{i%4DUuHi%DVKy%e+Q!~Uf`>>F6NgD{{I8~nO4!VgOvtFOc7(O)X`|7n*f zxBa4CJ-v9fUUH+`7sPVvpM_C*udZ@OTGTzx56QM5y~OlrZc&w9=)B?nmd@keRn+^= zvm~4sa5987LFDnU{(N|N zJAR8H@}p1fC+H(yTI4n#%~TbImMpuqYn9cQ<0QQ%=PzZItLkC*ef9WJUvfITKWh#D zc#__8`4am9%#NslIUw+<82#SR8AYG|woLfBg#!-&dqq}@P>|I0%lbdy0lSMmNe+}o zj0zZuFr6Wb?Y{Qy-S=|r`bdrDmhnmvkRnkdn`YCleU>Q$=je}LGhh>_QAj6aa_0Oc z%Swsmui;IRx7bN*=AAS@5yW&Y2hy;3&|HAiA8}!HT6!Z!RVn~MZg`RmI6&%#tBZDx zfD+y@Z~NWlk*4l13vmt3AK2wP!fQlnBbECL>?p)F?T)<`w&QN>cP_V>r7UTcsTaaP zTOb$f!P@zf$6>890NVKbIkG8rE?9!Y97sMSZjfF?A zYR8lp`LMoz~O?iaZN;gcX;LC-%Ia*R%A&SLx!YIf29?P+=XAAojK8!^OU*@?R&DK!#G_lsn!#;S375uZ&B0HH1|BO0R90$U>qs zSvHv>H~mAgNCcjo-e+;RjY6B9NCbQrZ|BHjTkehaU<9CSkdd>Vl*ifA2LNOP&R2Qdy3k3-TQ+ zbq=#vI43x`s=%~cGyN&y4Y!FxhwgDe@i6uv8^BLL&3z*SO=D0aLjih?gY4-9uWp5or)H+v~w6n5X#F-I52z=Z_p4JB(;M| zeaVFhuR2|3UD2MzVc~^nSoD2(dD#uL_1PdnIxeA{V5n`#3xf1Zx@4lw(DsQ&H$h zw#%3O<1173hjg2_nhKi!d1ej=h7y`hVjCNB6|HTnx>SWuCE-kgTnfT+YGX4_Lun({ zDv2`>d3vrS)tTf7ps_vvh!Cx^e1BFuWnEAh0(7fkNk|-3oU|iRWdsC6U)?Raft~HN z;^$U}vZK5O8|LV$>6X5T(uYkblv{zwPxnQBh(BQ5tA~J!vGiAMYP^_ki~pkIxDfOZ zUJDwq%O~WueeV6%uN<54&u*c&E4y431cklBNrb06zGOOy4XNT~JS-q(s6@)F@ovbe ze`fial(O4(-su%6@@1+V0MsdLLMyE8;)nou(7}czU(5ASaZYDT(kUZ0L(&g$nF^n9 z9-Pi`ZZLX&)^*M6As4_2Mmc9S7OT)F8KkL2NJ)KJcnCuWU=Wy402A&45#Q9Id~BBH z0cY*xlv!uXzKrXLH!xQu(OtJvEj|0-DmRj1vjFz{c*I4$Pe(+_V|^b~S!0xm{8lq= zZv)@NlcyL3Xdz+*|L137F7y6L-2VsrKw=q^S>F6i%<{Fr8zk06$Ay-(!L$fY@7mcng!2}L0t zgi|KxfB63Xtk_Q8#ZPipQ@!zgjdpEIbK_?q17Hoi4Eiyun$hrc>T(7pOLVLQE=lgGwA+A308p& z7@=09(|$>eLy5gLe{*|3b(M;1n;C^~v?o88jYib48eR4$QGsBFzd}3QuwO^_XE(=B zq+hMi0UFC|dB{LCwch7;zYT=NK})O%sgi0k#yV;My@24^B1+CuZmYOh0^b)5Ba_)) zC%i#_Iev&nsu%I|1N5=MVc#PrlunKAs&hY|3s5;@}`>sB>}gzxuB zB=2vrRyB3uiyW(hkDUNe1@&(b`;>ZvGgw|@s{zVC#_`HXIN_^J@Etb zA7A+F?ot37T{<-vTy8h&b3e+WKHE1oh;pUQrN4yRRrx?mT_9jRa2i4l1fUnLW^Cbl z!I1>VzyFe?VELWWhM?@?t-YPZkD-Qjo@bC2(o#ZtZmr{KZsdFWItV`rs$gp{724@C zL8K5}E0+DHcWcL^{BGei4>@J-3%a#$y6;I}=upc};-NDv-z#kPX26ylOpH)Ov1uU{ zkLj6oiH6l_s+B~_z;|Jc2oi?naS7#3H63~~lWj4rUnd=fCnKdkik<@R&kch9q##G{ z4u!%=rlM~Yp3jk*t8}1B`Sv6<%Z^}~1e@aq zg|JQ`QO2pSjAm-g*?IrNc$^~sIrNBo2$m|Sxanr?Mfs>2@Auu49 zGXlsS<9XS1&8h(dD*Hl&5HBDG!^pJ*lkau_Ur+7`7z;rcs$hT4we?3bT=7Fe<>{5( z2m2(c+hUz2BTHM8dCe*Z3XX&Av;b~a=$6EF>&^E8%nyxO@m_n!q&XD^A{SRjRZQ0L~qDeC=j&0$j6=LNIz@`ni^>ch|sv}^6 zlm>?28yPl@WmDPR?Y-A9X{U9Dv_IsbXJnzKCjkRksLOg#42uG2mE_acbTQ4)J|1V>%U@K(FP3AYhL0U zdeOCPN1qLv!|#c=p!_+%VNV(GHt`RuLRV^vz<5tt-r)yOK**kUWPspVAf|}ZL{LS= z@k(@@!P&W!>wwe`x{+GrFSWhHov7hu?{KuuT%kl#WO@*WX$i_@retlhQBj++SVNCx z5$78LxP>Z=^aJ)D280r_jj=zFfMJFXCIe^B{~V@d1rl_F(qo&AB4bC-vYL>x2jSKX zpuTG-6kgp3e^T&+dtV*i6a~)v@n?n*MffN59y}<0djUX zt27R+SE#hp8bzc#;rk$jw3r4)Q@eI$*`_)=Pvge8@8|8>H3X)<9YX6cXa=ii#Le;(qKm@%0-7$>2ShnYc`j#zJ7gu_FE^?uAkL|H)UIH#gPu^40!6^J=^ zr`}iwa^!4tzW~vOMZAaKF>*8A{^8m$i(VK)>?=#l`xrVe>wseSvM_aF zATNkY>kM_P3?1kE`uIq#mvr-wuTgUH0N<&JhF=(E9%^NS*HLm!4GZ4_XI zL=R5tlG5Mk_1rPfg)sk^llFuKPMPBhuU|L5q#yP_mzxp1o&pAzi-X31sgFpIHn@($ z_>=`AB5(8tP6p2zS5VEvH5J$M` z_much3>S7t3Yo`Yx!>83-hW9LYzDKP?mKdkD#QAK8*M((sx{eBQdrR<^3ZhFP81+& zBnJMUefQyNBji~$5d88Wfw1Lv59aJN9t2!pABLg;ewJ#LXL-10;QcJl+Y4Mtngb)k6JZlCf)3uD_u)J3sYyN;NN5hNbg$%W!i-GK%e&!Us)2IExWSss$YG(hm3kJ-h%yD z>8q^n$+4I(_y_mbT{du4P%h1j3oSpjhY97{+IZ`aA4ug!vNJ6*p?<2H(2w+GD3j$I z1TUXGyNzdf>_yB3grP~FZUs<2Quw;eEi*7s(-MiIkQ%@J^+WGdQvYSUN+TRiD-xto zJ=OUU+kxGYc!HCLNbCvR4lGTp~#L;DFzGd-#gJe*xf(P3hDQz|y)?b9mwU3WUVnpcqXM<@w%r-k*Wr^gzAv)8T^sqA=Ye z!7qy&exJmAcAt~CwS#@yNmjr8*T*!A6w4~E*ibaLRs0CFo(;R3=ODhDt6zWNodmo0 zXx&bT$6&+5c>a|WJ)F4G-^GjY0H#*tY=UNyYr_q5fsrcjk(c^~e*7Lf`!Jd`)p412 zn|^*hV= zFI4UbwA%X@smDd$cQOiMC%jfitTxTb+#`9`G=2rJDfK!E=5ra|So>lc{X1$~w28i+ z4p&cTGwZ#5VueiXS9O8#;RR$yg7tL9!^)Sz&pZYIzlSh}0}V{LxL$Cu%B4U5_}k}- zm~|CsD<076x@<>m=6w6N?WaThIBP`!u{-;WF)xc=2otx*lwf|5+MkdJePjh(B z9SH+%cHGCMAXNxB{_3^otDWdsV7Ob6n{0 z+&!(;iaHOX__5z_$Qk{%xYV%Ig@7iokGBwR`3642ZP#H#v9QGbWl8<|MS*=@qO@Uj z6+SZ_v9`1paUe5tFN~v(b#J3a_Lx0+;r9giZIx-A5TxdbG>xi#AZ5_z1V}B^n)sxT zz49}eK7EWb6wR!6-qQOrHQHkUvshvq%=G2d&@(#XM*Am1;WbnJ{X_!a{ZkphD$^TQ z=Iskb&}=lBm(RHiwJoGg`*NiQ6#RB$T#LF+>#ef;Jne&MxKPX!#r`&TVEFsp2jnNx>dClzpcPy&G&13a_<0qaR3i+k212~hoQ z8nMk{JP-t04I{GW5gUBqcJW-jSMrlw}>p)ptx?WKuCUV77taMiV zHok9V=6yv+Uts@fMY&A}amC=!Yj}eL@=e%XJ#%?agkt1jWF+10{(E9mHLDa>Ll7Vj zG=3cp%ljIB-6pC}6&`xJ*6WCP|IlglLWJ^?yviI8Ve)?V_i4%n;olzny62_`-|IGi z^=}p_O>Z8M;c4|RExu70E7ePW(HWVS&E$+LL6xSQgB`QfMQJ|4pCTFowA39p5P-|$ zUtM_H2HnP8_RoS~Vwk(FhbG zH41licj%=0a;Ln2STFBvU}Ne&O&%8bYKj!h1FA#sNM`232fX|U3QPp#3C?mN2;hE9 z;)!@5ixSPl<89^7gwhHc2YAX1KJK$#*3`KOMIQ253q7-*RJ5k)zp9GBO|Ga~X*^}US5oN@aG&waHV%vi~r{t^`ptTxb zL}q1W8S7*>7oWwvgV4uFLZ(@k`R*=LO_|Gu`prs~!WQXj-NLIa^2(7IHg>BG^N zc|i{-^=&Cek9dkJFQys|sjG9i>LLz|;yCv{^1i%c*h>8zF91kLvS9HBQi~ZU!JL`B zK8N+U0fr1*6??Ium)AF!6tc1eGhXIYL6IRT7rmKp7+>?%5Pa6zC5)KY$ycF0ZJ`G5nEQDG100U-jLkH8^UE4g6wq?sg%pP=-$&G#bcN`^?w3a6 z((s$6eRKcSEIslW-kk5Qi|5Mg-(xdLF}PxxVh$PuO}#aR6pW1kV4Af!Bqh*btXNNZ z>-4(IUl+L4dw+3LcpGut=qB45O+W)Q5?*zZ2A6rJcg`qkSvWA!j^r2mqKuCm6`Py? z@^T#Ux04HemPGd!Hs7NkZdVn1}8_j`o?)*OKZGS!`ff)gF zG?v-lj$wWNWCcw2Mg2o18D~1?3_b0XzdiKBNkYSDpcv@&kp0POmweJE2ZkIQ3B!a! zIgIoE+Xv?;34kyo^QYjZk+tEqZvq^#QG(OzX4~X+KtsoQoddTWUR(yo8R+ObEF1j<-syWOb>)JQ&Zbdu(sctU%Mt zW&YR0{ttY2TTXYZ?~WNU&cES1Z2q(7SrWDh``!J(JM+Nk$!hu&Y;(7E`ZNKTe0w+% zJc?Qnw2B+%UR}0;cB0Rufa(7-3FF}?629@LgTiEC&2uyL6NxexOp?AKT^aAx3gi(W zao>r>MPw0eQ3>IV02uLsC@>yK_epX6GRg4{NEL2wPPF9=*L2RV3yyK8DhuEK>rmmV z`&Q~#c`lgR&93TdOCja|ewOXmPNRh7!&dMT(1ett#iDr8HZW~VqWW@7fe9B6;7S+? zbC`d4@MEau&mKlOPKd>*10q0c{~^baw6!a*w^sY#0Xim{oOsiXiDOhbG&kl3c$$n1 zMRrD83&QucDSEcV*7LIp8VTA@F<%qe+_c`L;6on(>SjAU^}5c9!BCffT>$VQhe=)z z8(=Ej{5>jhmjB3{xDfj2R@VmHQ!CqjlO4KnuOmvHy3K#po$yp_V;p_MKjh1`(rzj6 zHW956k1yvntz{_g?Xbs`avK(IjlTnsu%htO;D7 z?J#x^EzuvVn&NA=!MEj7cwe5A-Z$Zk2LBZH$~%E* zf`((xH0?`}hs|HA%mtwfOEsZJxxrennkTYcwP#FKO5%Lpc^JXhSpV|ZH$Wr;`}`_( zIP==gd3LYyVtwD|*ZJGi{7~x8{=^bGVqu0RJ`n_BZH9+}kz%-4ZRsImi@rx%=ZEKs zcPnUXo6hbJV>fH;@1|bAHIe0ijYI*&kdT|HkDS$9No9 zCHo=*HWb~U+Dtzxr+Esao}6@|;Pf+E$ay0$kQp#s{wlw+7aIKbMdf`OqhoG*;Tco0 zjrP}VQG#Y2cJuqoJg&5({)S(BA}q9T1lGeWRyu=Je|)I!6a+aj!IP^1({)ZYe&x6w zt3a)Dq^TB+A7CdB0-}#z2Ur$W&h3YVw8==!xONy$uQmDWh-@15iEOt!q2m&?ZLA|w z8loSb(0}7y6Xu0?M5Uf4>VZGluB`wMf2oh;m)ghxVda>3m}4%V)r^0nVQ5V6f3>*) z0&VN!N0~GC^P}vj$`EDMZEmVV;N&RISY2C;$0;2(<{Lt&PKzqRByQdiEHGAbwtbS zPj`Da5%U6k1oEtVzI}QNw;!hT6F+~|@=c@$C4NtO@=xgP?|5MyZAyuCzcvq4rdAv@C06%gZ`9%I);R6UGiGJobfux+<0DLS&|MSG4UH z_~o{^^9>ixMg~mY!-@Fai{xaE4^;qy9iZN15Gbn5ZqHWf>Jc5Rv6(#n8`1NcCsdmG zab*dSXVPaE?)wCalD;$ivF%@nB#7D`@YG04p6ed9m}4iJW|pfVMLE<-c{=-8$e?cH zUdU#mCj4gb zZKA^b9p*9S(}8@tw~1RNPHr7tQr;P+-)D8|sq=*o)G%RGqt> zzP5yf`pVxb)I51D_G~Xp^GNK zVI6sAX)a9s)e{8N3?35YA6aQTXuyszK3ah~CemzA&CII#8F&F#KN41~8I^&_%}6MCNb{W87qAF`zj_Y^szhb> z3p3}KbOxotY|(lD=;)`fYE_*{S}x;f^SW#)SU&5X#o|-R|trpa|L5PS5aa0 zTHw8%SDSVtU4?vyrhnq+^@dgFS)|(y{~(4j%3UEiO-rBM9%`)8(dh33pMLiuurNY# z#10AsQ7%*0Cu_DSAU}P;X(JwA64~Q_^R%d_zSm^6Aux?Pn70PM>9EvLeOX z&w9c)pGmcL22;MO3C_B>=NC0RJpMp8?#ZUf=GWRvy z6RHq3B}=MGVg?9@iKFBpsvnkVh3{Vpp=`CcD=u~@ql{my|6?3ssi3mCOPnjI&E}VC zc@X+Yl>;;DNo0W0`0th!X{?luDhOC{E8N=?!w}K1{V=)+1={m(f`Oc|N=07>}3;z{-(A zm{JL=j?Sro5iecmE2-pWlRf(r%|HEQ7kgwQ9+kt=NBhtQI7OwcZ#3%$Uf%^r2nhjY zoQ08MfC%_X{O9~WcirMZMhn#z^ux4Erx-tf-6bHD)9eH&^L>^jvAd^9A^DCDs?0;k zkm7LE*KjP6`2d17MrQaaLqd_Rka}J$csvUec#hw78<=s(hyR>065~YCVCA9+#Q+; za(*L0IEw!r5P|@-;x33L$Lv9 zcuN8YG&g{<(SeJG18~(b!5yywSqQiLAX0;---;}mF5&b4lg|T?LwKREa{9YX_-zL@ZE?Zqi@HxK^2KO1>0LATu{te=T zprmHtY)bDVfxI1S}KBE7V zznP7KQ8HekWU#W6mw`dr-boV}pMQR==&5=Q5T=_q091jfc;R*jX#&=MQ%~@E@9^?`$v48ks<>(fI(F6L(5ppKy|$HWng*bKOb(4|cMUB&z$#ob#XV z5-mg)gmFIybZf=znm3ZPyUO^GJfxt0kmHjaTZ|sthsxXw&}Y)fOUSg=JhRSR^UjZ- zhqqb}Wsyw4zdnj6@#BAJa#-PdI4_dgafFXh85DsEQ_cT+5)XpZq$fZlBA_9UsE9r6 zEFec5?uqN@QhJ^IzwZrwl-5J`CmVPv{(YDTqEqWR^dI;5hXc~cxP%B3v&~s0`Ct89 z@S`i~a^c%V^N81dDT*ItFS*&IN;@O$EgzX0e7x&}TD=!zS}hTpezBLS>mdX(5< z)8DEI(-o_D)c-UX@dA1MuJ*yc>Hf4|`*B2S_O>w*-tbUwtiu`;W(Ud{HTty@(&x(T(F&;M zJ=?H>6`B7nf-90e8V`WSVp|0oEKB-P2M{}4ZDawzvM&a!y>`Y#jCsD%T_l``@ah(I2nJs~Q|%uSKu@k!m~*8B*IoA{*TgtF<(5sHCGG;n@NE%~Xt(G$^&<87u;}Na zx-8cq0g`uA(&RBFo=-4Y1GUZ<``Zw{xL4jfHkZw~%~wvtGueszcXt)_QwH8g!; z%s&3kSa~R$dO$-%L-)c@_hi7&>{6L_M>OZFkUQu;{sL_bUMStNrt{{&O(Wn~*zPOk zB>dnfszb29NSTf2pqIs68k|p-UrSrxgLHqi?3N-UFa!LHy9n1)=s>`yS+J{MEzS@ zNlfGtpma7kG&LR3JE@wB%rFA*h~~KitlO=IP)ZjN6dQLM6qsry zHkB#cyNh#n`)}bCrN1My*;k)^@>e4gJ`LJK?2)Pwp?4Tl4)4FA0(tvY+#1jOUM)xw zlMz4x-f@g^+yKUN`?Vu)|AwujArnM~Pa@y*Q9S8eS(u{-S%(Z5=R~pRl5ZGDjdqH% zC8rW&{##wOpU_oTIG4WXMk4&%2t1;lWcW5&!yxmOT*!hBcKyTqEcNoO+R2;Q?Yj+W z1-Y4?59fijz4(MIDwGe4-baYf08UCs;r|YefD-Md2ST;=cxwpgW=tR76-dQVAhn^= zG9Wk5lQk%jIR@KNU!UMp6@BfU;r+;y4VQ)D2!Il9HX%yW-9nOzV+m$YKzVaO`B8S7t z$!S2Mz`xw>V(RjE`0>bQp<0y&h~Y=M#jpy!#=dE>`=e_AjSZq6u!Dy1xJf~-7|0F! zPR9|n`e_7D2DIV2H(CESQ}hA>U>n|6`%z?YKEA~)BOVY%y=jPV zT=44R!L?J)736X#csn|lfBJ)o8ixaZclguWgrGO<`TN2FMfO}7;5}d+BlK0yTSH3* z4!=;5rOh85&2|x=46hkNaz?)U8&=bcfh=N_#8BNpZ2v$aVBo;sk^*X`v;4-LU;D>! zM*h12MxXIQy)SfAqE4;jY)wgnppazZkdNNVVF;(PLf^qK$FgY9+VFyBKE7UC|f z`R|?&egV11K3s$rJ6!GvoeW=jV*!-e(wA;x(2=d0E_e_%0x--0o8#~m^H1%AH5Z^B zn!TNPn927*bvaf0pt}zhK0o^V@WlGwwKo(*nQ|Q~4_;>~-8y20`HP>@UJa)3nEnGG z5Hwhs|FcmFG16ZVNb5hL`2Gc1{zWIMM{_OiKewV!hCi}U!VuE?s9wU-QbZ!)+Y^tS zGzp5OSi5iq6hmEr$w}&9DFgoB+i*`q`8TBi^MVS{SKEb8Aw%@K7@XCo(De2A`6%mf&a2#~y1N)+kJLD$1HCP!22)(U}xo2|j?WRzt(11j8Z_*v;P$R+Ug*Gy3VxV4K; zGGUGabnW*`Z}~`ydXL-l9e=GC$pY#z|63vy>E*m=$=j}iWP{sRTh0%H54`t>2xYH% zsk+M&u&pNgMCM@3e)Xc?jBWX-TIR_cQ1Z!RW7!B zBjZX=+^3}?SE)B+$EP+0oi1Fp5blDT?*}nsP>filqXH{ms zxU<$hetC`u)Wi+x|EKL-`y^#aQX+sDYIa{M;V%LqLrOk~lR>u0Q!+pyQSU4zY`?E^ z|5@)C)w6G_=i5YYC5SE_u(7hDNYr}uKT|@DSqF%S++lTIbIk^$a>{~0IH8KNFEy%+ zW#$&!ynpgNJh>6uR~?2c)ZMW+h0OKu231(7L_vETPaR+(P)Zy%0~yGm>E9?@@x!Jy z3PYgS}Q@b}x}E#F27@F+j}0=&Ql4gES&f8acMrPAVlVs9$97`FR))R5wI zc&}KFI1UIewh>3PkhnB7u zS3AT8_*|nexznG|Z*DU0c!K@jsI4J)5#DyNi#|e#`l1Vv1`1)*NVcy0LZ``aL0n8B zecupJ(rhq3u8bW0NIRhKYq$v1li+jp*4hfAd&wxYDE8vn1TQ7S@bTM|I2Ob z8vMOIxA7&_j{AKmD+O@EyXT`|dElt0pED^@IV0m)RPBUs*5jW60>>w1!@_G3aBKzG z_f(KfAPBk}-jQtR*Sroq!*3rbQ_m27e+YdzQjUb<_*k8vc_C)y!@cj5E>NxUhPu&g z@Z2<~esU`)ih+4opWe+K7sbN9n*9@n>#@n3*o z?xoROgDuvhq>jJ;Ve{6i<3roQNfgo5^4Q4(|GNExO2Dr7GjgA2zWuKp_K)K0R(6lv z!l$!zW-+T6mb3gQaAFviTQi{|*t%>{(mhTdy+y;Re4qT@kccy#{b z&zWy~kLO@>*WPj2k#H)|7L&gAJ37DmHQAme#@m;(Y8Nu^`D5vf8sZFW#+lA2!HK=( zJ)#hO6JD*`o~&c*&46d}g=Qj@SsoB5ikC z^1V8E+&<-OzuS_C`p5<<(A6fB`LXT(!kV^0_~hL6PpW4={l%|#xgdh?5EIk~lu8{D z2hiyhv3Yxij_#$Wu>P@7SYsl`-~3;}Ktx{34_NL^Kwin&=?!HDv3elQDbcU*qyYpN z(#yw~f1vFGK-t%CC-qa-4FYHbA^h>bag-I&*qaxwn?Qv|idE$<>1H|Gr6JtUu(he2$eg!N z@HTF@dG1)*y;4fxe)4_ZkpaBHH9hXp9p4|gLrRQyuevRd@gSS}JhRnWqrvm|U@>qM z=yl7RQROTKwQtzP3!zUF)_6Ld#NGA6v~2{J9Dd`h6{%+XsU#qGLh%`fB1Hc?wfayK zN`H4BpDp)npVQuu$DVW1qsBS&AJ2eP%6Qw>;k{)Z$8%HL=Q4(a$Ng2_vHw&vA!1L+9zc8vaX2GtqJ{L-;gvF0IR$em zMQ8@{Qp3+3Quk)TJ$?I<8KmwzD*7#(q<@Mc`dchngW}cRG14(Z6K7{T|LhFXwhqUQ;BET;cYqPcAcMgt6M$V9$(?jHo@Sud$an$U&5F zZ1QNh^ztt)E*d#Ij;<43oSKKnd+WNr$_r}+s_O_x6DZSB10*5Q{ourqq>mTl| zx4y^(cy+9;t@R=*j>3_dmm_m)$k$#937V(sllby&5)Xex^UD-|m|q<(jEd#@DV(of zAd7sSdmS*zUDqJ9|K%O2J2OfdUiK{{b{PCy)pi<;hp~7v1CQj&4-10 zgO<3dqhYH1#-Fa}Q{pjql5>>P6gZH21zLfxZ4$SK4T@7b!|`nWF9b*84Bq8&Eht;9 z*P72x&NUCZ7*@B$`FtE=hz5b}S`|c6Ey+j@D1ZibjJaRlR;{cxAWv z?Nqa>QqV*H-*zzaPvpLMHt~nl(x6?vrPpR?zn7~wow?oj*1TKmx4j71>$hvtC$DLD zUrz0^tiP0792U&dxJxNv@r}Elsjn^aSLUu=9#mD{&9n8|ayIL$!H3s>%KEvbchBFW z%cd?VU83mGF#Dar9*s~w&AnmQRQIOvR+uWsuZ?+|a=TzApXO@q^(r%8=}iv#wCnFq z=K9}JbqU@k99Q%j-}NNk+qLCP)jXfmOO|)@?mHcnynd6({mJisP1_}u7k)|eYHXWK z63eQ)E$ufFi!3CWUY2gw%e>omCv}qEX66aH-k&35f9`Q@Us|NPetVqe8=dX*VxJdn ze`q7b=Dn(UA(2sf&g)cOmQFhNJ#<-aMELJZbA#@to>25@kbW<)&!X01 z%NMJt>1ST)tyX)h@?`DxhbgCHr>S4wv}WC&Nw-!{+Z7$2D}74QAcXTvip=M0%Tp_N zor=k`)t|ra^ySr-+(|R9mB(E=`MX#y(wSw)$!iymzB;^c*>%&^*7HxTnRga=soSZT zdDl+9s;r!v8hk6POtzBaig4pRp7eWF(<8gufvNHPu6xs-=e{;mnHzJyGKE+8L0j}; z@%8-e^UCL5HhMiR>sD3Rve&yVZ#{Q1*CO8c+qSr^Z#CN;)(X5>tGG5yUw3<+CfhaL z%bP;hZ?jvgJU67BWyiy74_)6r)_nSxttxn0`0?HE^5(uydHVgP+HE$V?Lv)Leti43 zWA|;f-RqX``95>)^P-fw!Vi{3KNsII-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J w!5uhoe-Jcg1nPN%MiEAtgE$;km@@t6ukO)1^!cY^83Pb_y85}Sb4q9e0FIsP9{>OV literal 0 HcmV?d00001 diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Info.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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:example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/Runner.rc b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/main.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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.CreateAndShow(L"example", 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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/resource.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/.metadata b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/.metadata +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/main.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Info.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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:example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/Runner.rc b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/main.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/resource.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/.metadata b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/.metadata +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/main.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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:example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/.gitignore b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/main.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resource.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 zcmeHQc|26z|35SKE&G-*mXah&B~fFkXr)DEO&hIfqby^T&>|8^_Ub8Vp#`BLl3lbZ zvPO!8k!2X>cg~Elr=IVxo~J*a`+9wR=A83c-k-DFd(XM&UI1VKCqM@V;DDtJ09WB} zRaHKiW(GT00brH|0EeTeKVbpbGZg?nK6-j827q-+NFM34gXjqWxJ*a#{b_apGN<-L_m3#8Z26atkEn& ze87Bvv^6vVmM+p+cQ~{u%=NJF>#(d;8{7Q{^rWKWNtf14H}>#&y7$lqmY6xmZryI& z($uy?c5-+cPnt2%)R&(KIWEXww>Cnz{OUpT>W$CbO$h1= z#4BPMkFG1Y)x}Ui+WXr?Z!w!t_hjRq8qTaWpu}FH{MsHlU{>;08goVLm{V<&`itk~ zE_Ys=D(hjiy+5=?=$HGii=Y5)jMe9|wWoD_K07(}edAxh`~LBorOJ!Cf@f{_gNCC| z%{*04ViE!#>@hc1t5bb+NO>ncf@@Dv01K!NxH$3Eg1%)|wLyMDF8^d44lV!_Sr}iEWefOaL z8f?ud3Q%Sen39u|%00W<#!E=-RpGa+H8}{ulxVl4mwpjaU+%2pzmi{3HM)%8vb*~-M9rPUAfGCSos8GUXp02|o~0BTV2l#`>>aFV&_P$ejS;nGwSVP8 zMbOaG7<7eKD>c12VdGH;?2@q7535sa7MN*L@&!m?L`ASG%boY7(&L5imY#EQ$KrBB z4@_tfP5m50(T--qv1BJcD&aiH#b-QC>8#7Fx@3yXlonJI#aEIi=8&ChiVpc#N=5le zM*?rDIdcpawoc5kizv$GEjnveyrp3sY>+5_R5;>`>erS%JolimF=A^EIsAK zsPoVyyUHCgf0aYr&alx`<)eb6Be$m&`JYSuBu=p8j%QlNNp$-5C{b4#RubPb|CAIS zGE=9OFLP7?Hgc{?k45)84biT0k&-C6C%Q}aI~q<(7BL`C#<6HyxaR%!dFx7*o^laG z=!GBF^cwK$IA(sn9y6>60Rw{mYRYkp%$jH z*xQM~+bp)G$_RhtFPYx2HTsWk80+p(uqv9@I9)y{b$7NK53rYL$ezbmRjdXS?V}fj zWxX_feWoLFNm3MG7pMUuFPs$qrQWO9!l2B(SIuy2}S|lHNbHzoE+M2|Zxhjq9+Ws8c{*}x^VAib7SbxJ*Q3EnY5lgI9 z=U^f3IW6T=TWaVj+2N%K3<%Un;CF(wUp`TC&Y|ZjyFu6co^uqDDB#EP?DV5v_dw~E zIRK*BoY9y-G_ToU2V_XCX4nJ32~`czdjT!zwme zGgJ0nOk3U4@IE5JwtM}pwimLjk{ln^*4HMU%Fl4~n(cnsLB}Ja-jUM>xIB%aY;Nq8 z)Fp8dv1tkqKanv<68o@cN|%thj$+f;zGSO7H#b+eMAV8xH$hLggtt?O?;oYEgbq@= zV(u9bbd12^%;?nyk6&$GPI%|+<_mEpJGNfl*`!KV;VfmZWw{n{rnZ51?}FDh8we_L z8OI9nE31skDqJ5Oa_ybn7|5@ui>aC`s34p4ZEu6-s!%{uU45$Zd1=p$^^dZBh zu<*pDDPLW+c>iWO$&Z_*{VSQKg7=YEpS3PssPn1U!lSm6eZIho*{@&20e4Y_lRklKDTUCKI%o4Pc<|G^Xgu$J^Q|B87U;`c1zGwf^-zH*VQ^x+i^OUWE0yd z;{FJq)2w!%`x7yg@>uGFFf-XJl4H`YtUG%0slGKOlXV`q?RP>AEWg#x!b{0RicxGhS!3$p7 zij;{gm!_u@D4$Ox%>>bPtLJ> zwKtYz?T_DR1jN>DkkfGU^<#6sGz|~p*I{y`aZ>^Di#TC|Z!7j_O1=Wo8thuit?WxR zh9_S>kw^{V^|g}HRUF=dcq>?q(pHxw!8rx4dC6vbQVmIhmICF#zU!HkHpQ>9S%Uo( zMw{eC+`&pb=GZRou|3;Po1}m46H6NGd$t<2mQh}kaK-WFfmj_66_17BX0|j-E2fe3Jat}ijpc53 zJV$$;PC<5aW`{*^Z6e5##^`Ed#a0nwJDT#Qq~^e8^JTA=z^Kl>La|(UQ!bI@#ge{Dzz@61p-I)kc2?ZxFt^QQ}f%ldLjO*GPj(5)V9IyuUakJX=~GnTgZ4$5!3E=V#t`yOG4U z(gphZB6u2zsj=qNFLYShhg$}lNpO`P9xOSnO*$@@UdMYES*{jJVj|9z-}F^riksLK zbsU+4-{281P9e2UjY6tse^&a)WM1MFw;p#_dHhWI7p&U*9TR0zKdVuQed%6{otTsq z$f~S!;wg#Bd9kez=Br{m|66Wv z#g1xMup<0)H;c2ZO6su_ii&m8j&+jJz4iKnGZ&wxoQX|5a>v&_e#6WA!MB_4asTxLRGQCC5cI(em z%$ZfeqP>!*q5kU>a+BO&ln=4Jm>Ef(QE8o&RgLkk%2}4Tf}U%IFP&uS7}&|Q-)`5< z+e>;s#4cJ-z%&-^&!xsYx777Wt(wZY9(3(avmr|gRe4cD+a8&!LY`1^T?7x{E<=kdY9NYw>A;FtTvQ=Y&1M%lyZPl$ss1oY^Sl8we}n}Aob#6 zl4jERwnt9BlSoWb@3HxYgga(752Vu6Y)k4yk9u~Kw>cA5&LHcrvn1Y-HoIuFWg~}4 zEw4bR`mXZQIyOAzo)FYqg?$5W<;^+XX%Uz61{-L6@eP|lLH%|w?g=rFc;OvEW;^qh z&iYXGhVt(G-q<+_j}CTbPS_=K>RKN0&;dubh0NxJyDOHFF;<1k!{k#7b{|Qok9hac z;gHz}6>H6C6RnB`Tt#oaSrX0p-j-oRJ;_WvS-qS--P*8}V943RT6kou-G=A+7QPGQ z!ze^UGxtW3FC0$|(lY9^L!Lx^?Q8cny(rR`es5U;-xBhphF%_WNu|aO<+e9%6LuZq zt(0PoagJG<%hyuf;te}n+qIl_Ej;czWdc{LX^pS>77s9t*2b4s5dvP_!L^3cwlc)E!(!kGrg~FescVT zZCLeua3f4;d;Tk4iXzt}g}O@nlK3?_o91_~@UMIl?@77Qc$IAlLE95#Z=TES>2E%z zxUKpK{_HvGF;5%Q7n&vA?`{%8ohlYT_?(3A$cZSi)MvIJygXD}TS-3UwyUxGLGiJP znblO~G|*uA^|ac8E-w#}uBtg|s_~s&t>-g0X%zIZ@;o_wNMr_;{KDg^O=rg`fhDZu zFp(VKd1Edj%F zWHPl+)FGj%J1BO3bOHVfH^3d1F{)*PL&sRX`~(-Zy3&9UQX)Z;c51tvaI2E*E7!)q zcz|{vpK7bjxix(k&6=OEIBJC!9lTkUbgg?4-yE{9+pFS)$Ar@vrIf`D0Bnsed(Cf? zObt2CJ>BKOl>q8PyFO6w)+6Iz`LW%T5^R`U_NIW0r1dWv6OY=TVF?N=EfA(k(~7VBW(S;Tu5m4Lg8emDG-(mOSSs=M9Q&N8jc^Y4&9RqIsk(yO_P(mcCr}rCs%1MW1VBrn=0-oQN(Xj!k%iKV zb%ricBF3G4S1;+8lzg5PbZ|$Se$)I=PwiK=cDpHYdov2QO1_a-*dL4KUi|g&oh>(* zq$<`dQ^fat`+VW?m)?_KLn&mp^-@d=&7yGDt<=XwZZC=1scwxO2^RRI7n@g-1o8ps z)&+et_~)vr8aIF1VY1Qrq~Xe``KJrQSnAZ{CSq3yP;V*JC;mmCT6oRLSs7=GA?@6g zUooM}@tKtx(^|aKK8vbaHlUQqwE0}>j&~YlN3H#vKGm@u)xxS?n9XrOWUfCRa< z`20Fld2f&;gg7zpo{Adh+mqNntMc-D$N^yWZAZRI+u1T1zWHPxk{+?vcS1D>08>@6 zLhE@`gt1Y9mAK6Z4p|u(5I%EkfU7rKFSM=E4?VG9tI;a*@?6!ey{lzN5=Y-!$WFSe z&2dtO>^0@V4WRc#L&P%R(?@KfSblMS+N+?xUN$u3K4Ys%OmEh+tq}fnU}i>6YHM?< zlnL2gl~sF!j!Y4E;j3eIU-lfa`RsOL*Tt<%EFC0gPzoHfNWAfKFIKZN8}w~(Yi~=q z>=VNLO2|CjkxP}RkutxjV#4fWYR1KNrPYq5ha9Wl+u>ipsk*I(HS@iLnmGH9MFlTU zaFZ*KSR0px>o+pL7BbhB2EC1%PJ{67_ z#kY&#O4@P=OV#-79y_W>Gv2dxL*@G7%LksNSqgId9v;2xJ zrh8uR!F-eU$NMx@S*+sk=C~Dxr9Qn7TfWnTupuHKuQ$;gGiBcU>GF5sWx(~4IP3`f zWE;YFO*?jGwYh%C3X<>RKHC-DZ!*r;cIr}GLOno^3U4tFSSoJp%oHPiSa%nh=Zgn% z14+8v@ygy0>UgEN1bczD6wK45%M>psM)y^)IfG*>3ItX|TzV*0i%@>L(VN!zdKb8S?Qf7BhjNpziA zR}?={-eu>9JDcl*R=OP9B8N$IcCETXah9SUDhr{yrld{G;PnCWRsPD7!eOOFBTWUQ=LrA_~)mFf&!zJX!Oc-_=kT<}m|K52 z)M=G#;p;Rdb@~h5D{q^K;^fX-m5V}L%!wVC2iZ1uu401Ll}#rocTeK|7FAeBRhNdQ zCc2d^aQnQp=MpOmak60N$OgS}a;p(l9CL`o4r(e-nN}mQ?M&isv-P&d$!8|1D1I(3-z!wi zTgoo)*Mv`gC?~bm?S|@}I|m-E2yqPEvYybiD5azInexpK8?9q*$9Yy9-t%5jU8~ym zgZDx>!@ujQ=|HJnwp^wv-FdD{RtzO9SnyfB{mH_(c!jHL*$>0o-(h(eqe*ZwF6Lvu z{7rkk%PEqaA>o+f{H02tzZ@TWy&su?VNw43! z-X+rN`6llvpUms3ZiSt)JMeztB~>9{J8SPmYs&qohxdYFi!ra8KR$35Zp9oR)eFC4 zE;P31#3V)n`w$fZ|4X-|%MX`xZDM~gJyl2W;O$H25*=+1S#%|53>|LyH za@yh+;325%Gq3;J&a)?%7X%t@WXcWL*BaaR*7UEZad4I8iDt7^R_Fd`XeUo256;sAo2F!HcIQKk;h})QxEsPE5BcKc7WyerTchgKmrfRX z!x#H_%cL#B9TWAqkA4I$R^8{%do3Y*&(;WFmJ zU7Dih{t1<{($VtJRl9|&EB?|cJ)xse!;}>6mSO$o5XIx@V|AA8ZcoD88ZM?C*;{|f zZVmf94_l1OmaICt`2sTyG!$^UeTHx9YuUP!omj(r|7zpm5475|yXI=rR>>fteLI+| z)MoiGho0oEt=*J(;?VY0QzwCqw@cVm?d7Y!z0A@u#H?sCJ*ecvyhj& z-F77lO;SH^dmf?L>3i>?Z*U}Em4ZYV_CjgfvzYsRZ+1B!Uo6H6mbS<-FFL`ytqvb& zE7+)2ahv-~dz(Hs+f})z{*4|{)b=2!RZK;PWwOnO=hG7xG`JU5>bAvUbdYd_CjvtHBHgtGdlO+s^9ca^Bv3`t@VRX2_AD$Ckg36OcQRF zXD6QtGfHdw*hx~V(MV-;;ZZF#dJ-piEF+s27z4X1qi5$!o~xBnvf=uopcn7ftfsZc zy@(PuOk`4GL_n(H9(E2)VUjqRCk9kR?w)v@xO6Jm_Mx})&WGEl=GS0#)0FAq^J*o! zAClhvoTsNP*-b~rN{8Yym3g{01}Ep^^Omf=SKqvN?{Q*C4HNNAcrowIa^mf+3PRy! z*_G-|3i8a;+q;iP@~Of_$(vtFkB8yOyWt2*K)vAn9El>=D;A$CEx6b*XF@4y_6M+2 zpeW`RHoI_p(B{%(&jTHI->hmNmZjHUj<@;7w0mx3&koy!2$@cfX{sN19Y}euYJFn& z1?)+?HCkD0MRI$~uB2UWri})0bru_B;klFdwsLc!ne4YUE;t41JqfG# zZJq6%vbsdx!wYeE<~?>o4V`A3?lN%MnKQ`z=uUivQN^vzJ|C;sdQ37Qn?;lpzg})y z)_2~rUdH}zNwX;Tp0tJ78+&I=IwOQ-fl30R79O8@?Ub8IIA(6I`yHn%lARVL`%b8+ z4$8D-|MZZWxc_)vu6@VZN!HsI$*2NOV&uMxBNzIbRgy%ob_ zhwEH{J9r$!dEix9XM7n&c{S(h>nGm?el;gaX0@|QnzFD@bne`el^CO$yXC?BDJ|Qg z+y$GRoR`?ST1z^e*>;!IS@5Ovb7*RlN>BV_UC!7E_F;N#ky%1J{+iixp(dUJj93aK zzHNN>R-oN7>kykHClPnoPTIj7zc6KM(Pnlb(|s??)SMb)4!sMHU^-ntJwY5Big7xv zb1Ew`Xj;|D2kzGja*C$eS44(d&RMU~c_Y14V9_TLTz0J#uHlsx`S6{nhsA0dWZ#cG zJ?`fO50E>*X4TQLv#nl%3GOk*UkAgt=IY+u0LNXqeln3Z zv$~&Li`ZJOKkFuS)dJRA>)b_Da%Q~axwA_8zNK{BH{#}#m}zGcuckz}riDE-z_Ms> zR8-EqAMcfyGJCtvTpaUVQtajhUS%c@Yj}&6Zz;-M7MZzqv3kA7{SuW$oW#=0az2wQ zg-WG@Vb4|D`pl~Il54N7Hmsauc_ne-a!o5#j3WaBBh@Wuefb!QJIOn5;d)%A#s+5% zuD$H=VNux9bE-}1&bcYGZ+>1Fo;3Z@e&zX^n!?JK*adSbONm$XW9z;Q^L>9U!}Toj2WdafJ%oL#h|yWWwyAGxzfrAWdDTtaKl zK4`5tDpPg5>z$MNv=X0LZ0d6l%D{(D8oT@+w0?ce$DZ6pv>{1&Ok67Ix1 zH}3=IEhPJEhItCC8E=`T`N5(k?G=B4+xzZ?<4!~ ze~z6Wk9!CHTI(0rLJ4{JU?E-puc;xusR?>G?;4vt;q~iI9=kDL=z0Rr%O$vU`30X$ zDZRFyZ`(omOy@u|i6h;wtJlP;+}$|Ak|k2dea7n?U1*$T!sXqqOjq^NxLPMmk~&qI zYg0W?yK8T(6+Ea+$YyspKK?kP$+B`~t3^Pib_`!6xCs32!i@pqXfFV6PmBIR<-QW= zN8L{pt0Vap0x`Gzn#E@zh@H)0FfVfA_Iu4fjYZ+umO1LXIbVc$pY+E234u)ttcrl$ z>s92z4vT%n6cMb>=XT6;l0+9e(|CZG)$@C7t7Z7Ez@a)h)!hyuV&B5K%%)P5?Lk|C zZZSVzdXp{@OXSP0hoU-gF8s8Um(#xzjP2Vem zec#-^JqTa&Y#QJ>-FBxd7tf`XB6e^JPUgagB8iBSEps;92KG`!#mvVcPQ5yNC-GEG zTiHEDYfH+0O15}r^+ z#jxj=@x8iNHWALe!P3R67TwmhItn**0JwnzSV2O&KE8KcT+0hWH^OPD1pwiuyx=b@ zNf5Jh0{9X)8;~Es)$t@%(3!OnbY+`@?i{mGX7Yy}8T_*0a6g;kaFPq;*=px5EhO{Cp%1kI<0?*|h8v!6WnO3cCJRF2-CRrU3JiLJnj@6;L)!0kWYAc_}F{2P))3HmCrz zQ&N&gE70;`!6*eJ4^1IR{f6j4(-l&X!tjHxkbHA^Zhrnhr9g{exN|xrS`5Pq=#Xf& zG%P=#ra-TyVFfgW%cZo5OSIwFL9WtXAlFOa+ubmI5t*3=g#Y zF%;70p5;{ZeFL}&}yOY1N1*Q;*<(kTB!7vM$QokF)yr2FlIU@$Ph58$Bz z0J?xQG=MlS4L6jA22eS42g|9*9pX@$#*sUeM(z+t?hr@r5J&D1rx}2pW&m*_`VDCW zUYY@v-;bAO0HqoAgbbiGGC<=ryf96}3pouhy3XJrX+!!u*O_>Si38V{uJmQ&USptX zKp#l(?>%^7;2%h(q@YWS#9;a!JhKlkR#Vd)ERILlgu!Hr@jA@V;sk4BJ-H#p*4EqC zDGjC*tl=@3Oi6)Bn^QwFpul18fpkbpg0+peH$xyPBqb%`$OUhPKyWb32o7clB*9Z< zN=i~NLjavrLtwgJ01bufP+>p-jR2I95|TpmKpQL2!oV>g(4RvS2pK4*ou%m(h6r3A zX#s&`9LU1ZG&;{CkOK!4fLDTnBys`M!vuz>Q&9OZ0hGQl!~!jSDg|~s*w52opC{sB ze|Cf2luD(*G13LcOAGA!s2FjSK8&IE5#W%J25w!vM0^VyQM!t)inj&RTiJ!wXzFgz z3^IqzB7I0L$llljsGq})thBy9UOyjtFO_*hYM_sgcMk>44jeH0V1FDyELc{S1F-;A zS;T^k^~4biG&V*Irq}O;e}j$$+E_#G?HKIn05iP3j|87TkGK~SqG!-KBg5+mN(aLm z8ybhIM`%C19UX$H$KY6JgXbY$0AT%rEpHC;u`rQ$Y=rxUdsc5*Kvc8jaYaO$^)cI6){P6K0r)I6DY4Wr4&B zLQUBraey#0HV|&c4v7PVo3n$zHj99(TZO^3?Ly%C4nYvJTL9eLBLHsM3WKKD>5!B` zQ=BsR3aR6PD(Fa>327E2HAu5TM~Wusc!)>~(gM)+3~m;92Jd;FnSib=M5d6;;5{%R zb4V7DEJ0V!CP-F*oU?gkc>ksUtAYP&V4ND5J>J2^jt*vcFflQWCrB&fLdT%O59PVJ zhid#toR=FNgD!q3&r8#wEBr`!wzvQu5zX?Q>nlSJ4i@WC*CN*-xU66F^V5crWevQ9gsq$I@z1o(a=k7LL~ z7m_~`o;_Ozha1$8Q}{WBehvAlO4EL60y5}8GDrZ< zXh&F}71JbW2A~8KfEWj&UWV#4+Z4p`b{uAj4&WC zha`}X@3~+Iz^WRlOHU&KngK>#j}+_o@LdBC1H-`gT+krWX3-;!)6?{FBp~%20a}FL zFP9%Emqcwa#(`=G>BBZ0qZDQhmZKJg_g8<=bBFKWr!dyg(YkpE+|R*SGpDVU!+VlU zFC54^DLv}`qa%49T>nNiA9Q7Ips#!Xx90tCU2gvK`(F+GPcL=J^>No{)~we#o@&mUb6c$ zCc*<|NJBk-#+{j9xkQ&ujB zI~`#kN~7W!f*-}wkG~Ld!JqZ@tK}eeSnsS5J1fMFXm|`LJx&}5`@dK3W^7#Wnm+_P zBZkp&j1fa2Y=eIjJ0}gh85jt43kaIXXv?xmo@eHrka!Z|vQv12HN#+!I5E z`(fbuW>gFiJL|uXJ!vKt#z3e3HlVdboH7;e#i3(2<)Fg-I@BR!qY#eof3MFZ&*Y@l zI|KJf&ge@p2Dq09Vu$$Qxb7!}{m-iRk@!)%KL)txi3;~Z4Pb}u@GsW;ELiWeG9V51 znX#}B&4Y2E7-H=OpNE@q{%hFLxwIpBF2t{vPREa8_{linXT;#1vMRWjOzLOP$-hf( z>=?$0;~~PnkqY;~K{EM6Vo-T(0K{A0}VUGmu*hR z{tw3hvBN%N3G3Yw`X5Te+F{J`(3w1s3-+1EbnFQKcrgrX1Jqvs@ADGe%M0s$EbK$$ zK)=y=upBc6SjGYAACCcI=Y*6Fi8_jgwZlLxD26fnQfJmb8^gHRN5(TemhX@0e=vr> zg`W}6U>x6VhoA3DqsGGD9uL1DhB3!OXO=k}59TqD@(0Nb{)Ut_luTioK_>7wjc!5C zIr@w}b`Fez3)0wQfKl&bae7;PcTA7%?f2xucM0G)wt_KO!Ewx>F~;=BI0j=Fb4>pp zv}0R^xM4eti~+^+gE$6b81p(kwzuDti(-K9bc|?+pJEl@H+jSYuxZQV8rl8 zjp@M{#%qItIUFN~KcO9Hed*`$5A-2~pAo~K&<-Q+`9`$CK>rzqAI4w~$F%vs9s{~x zg4BP%Gy*@m?;D6=SRX?888Q6peF@_4Z->8wAH~Cn!R$|Hhq2cIzFYqT_+cDourHbY z0qroxJnrZ4Gh+Ay+F`_c%+KRT>y3qw{)89?=hJ@=KO=@ep)aBJ$c!JHfBMJpsP*3G za7|)VJJ8B;4?n{~ldJF7%jmb`-ftIvNd~ekoufG(`K(3=LNc;HBY& z(lp#q8XAD#cIf}k49zX_i`*fO+#!zKA&%T3j@%)R+#yag067CU%yUEe47>wzGU8^` z1EXFT^@I!{J!F8!X?S6ph8J=gUi5tl93*W>7}_uR<2N2~e}FaG?}KPyugQ=-OGEZs z!GBoyYY+H*ANn4?Z)X4l+7H%`17i5~zRlRIX?t)6_eu=g2Q`3WBhxSUeea+M-S?RL zX9oBGKn%a!H+*hx4d2(I!gsi+@SQK%<{X22M~2tMulJoa)0*+z9=-YO+;DFEm5eE1U9b^B(Z}2^9!Qk`!A$wUE z7$Ar5?NRg2&G!AZqnmE64eh^Anss3i!{}%6@Et+4rr!=}!SBF8eZ2*J3ujCWbl;3; z48H~goPSv(8X61fKKdpP!Z7$88NL^Z?j`!^*I?-P4X^pMxyWz~@$(UeAcTSDd(`vO z{~rc;9|GfMJcApU3k}22a!&)k4{CU!e_ny^Y3cO;tOvOMKEyWz!vG(Kp*;hB?d|R3`2X~=5a6#^o5@qn?J-bI8Ppip{-yG z!k|VcGsq!jF~}7DMr49Wap-s&>o=U^T0!Lcy}!(bhtYsPQy z4|EJe{12QL#=c(suQ89Mhw9<`bui%nx7Nep`C&*M3~vMEACmcRYYRGtANq$F%zh&V zc)cEVeHz*Z1N)L7k-(k3np#{GcDh2Q@ya0YHl*n7fl*ZPAsbU-a94MYYtA#&!c`xGIaV;yzsmrjfieTEtqB_WgZp2*NplHx=$O{M~2#i_vJ{ps-NgK zQsxKK_CBM2PP_je+Xft`(vYfXXgIUr{=PA=7a8`2EHk)Ym2QKIforz# tySWtj{oF3N9@_;i*Fv5S)9x^z=nlWP>jpp-9)52ZmLVA=i*%6g{{fxOO~wEK literal 0 HcmV?d00001 diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/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/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/.metadata b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/.metadata +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/.gitignore b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/CMakeLists.txt b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/main.cc b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.cc b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/.gitignore b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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 zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Info.plist b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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:example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/.gitignore b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/CMakeLists.txt b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/Runner.rc b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/main.cpp b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/resource.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.cpp b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/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/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.h b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/.metadata b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/.metadata +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/.gitignore b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/main.cc b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.cc b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/.gitignore b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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:example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/.gitignore b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/main.cpp b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/resource.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/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/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/.metadata b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/.metadata +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/.gitignore b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/main.cc b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.cc b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/.gitignore b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jR^;j87-Auq zoUlN^K{r-Q+XN;zI ze|?*NFmgt#V#GwrSWaz^2G&@SBmck6ZcIFMww~vE<1E?M2#KUn1CzsB6D2+0SuRV@ zV2kK5HvIGB{HX-hQzs0*AB%5$9RJ@a;)Ahq#p$GSP91^&hi#6sg*;a~dt}4AclK>h z_3MoPRQ{i;==;*1S-mY<(JFzhAxMI&<61&m$J0NDHdJ3tYx~j0%M-uN6Zl8~_0DOkGXc0001@sz3l12C6Xg{AT~( zm6w64BA|AX`Ve)YY-glyudNN>MAfkXz-T7`_`fEolM;0T0BA)(02-OaW z0*cW7Z~ec94o8&g0D$N>b!COu{=m}^%oXZ4?T8ZyPZuGGBPBA7pbQMoV5HYhiT?%! zcae~`(QAN4&}-=#2f5fkn!SWGWmSeCISBcS=1-U|MEoKq=k?_x3apK>9((R zuu$9X?^8?@(a{qMS%J8SJPq))v}Q-ZyDm6Gbie0m92=`YlwnQPQP1kGSm(N2UJ3P6 z^{p-u)SSCTW~c1rw;cM)-uL2{->wCn2{#%;AtCQ!m%AakVs1K#v@(*-6QavyY&v&*wO_rCJXJuq$c$7ZjsW+pJo-$L^@!7X04CvaOpPyfw|FKvu;e(&Iw>Tbg zL}#8e^?X%TReXTt>gsBByt0kSU20oQx*~P=4`&tcZ7N6t-6LiK{LxX*p6}9c<0Pu^ zLx1w_P4P2V>bX=`F%v$#{sUDdF|;rbI{p#ZW`00Bgh(eB(nOIhy8W9T>3aQ=k8Z9% zB+TusFABF~J?N~fAd}1Rme=@4+1=M{^P`~se7}e3;mY0!%#MJf!XSrUC{0uZqMAd7%q zQY#$A>q}noIB4g54Ue)x>ofVm3DKBbUmS4Z-bm7KdKsUixva)1*&z5rgAG2gxG+_x zqT-KNY4g7eM!?>==;uD9Y4iI(Hu$pl8!LrK_Zb}5nv(XKW{9R144E!cFf36p{i|8pRL~p`_^iNo z{mf7y`#hejw#^#7oKPlN_Td{psNpNnM?{7{R-ICBtYxk>?3}OTH_8WkfaTLw)ZRTfxjW+0>gMe zpKg~`Bc$Y>^VX;ks^J0oKhB#6Ukt{oQhN+o2FKGZx}~j`cQB%vVsMFnm~R_1Y&Ml? zwFfb~d|dW~UktY@?zkau>Owe zRroi(<)c4Ux&wJfY=3I=vg)uh;sL(IYY9r$WK1$F;jYqq1>xT{LCkIMb3t2jN8d`9 z=4(v-z7vHucc_fjkpS}mGC{ND+J-hc_0Ix4kT^~{-2n|;Jmn|Xf9wGudDk7bi*?^+ z7fku8z*mbkGm&xf&lmu#=b5mp{X(AwtLTf!N`7FmOmX=4xwbD=fEo8CaB1d1=$|)+ z+Dlf^GzGOdlqTO8EwO?8;r+b;gkaF^$;+#~2_YYVH!hD6r;PaWdm#V=BJ1gH9ZK_9 zrAiIC-)z)hRq6i5+$JVmR!m4P>3yJ%lH)O&wtCyum3A*})*fHODD2nq!1@M>t@Za+ zH6{(Vf>_7!I-APmpsGLYpl7jww@s5hHOj5LCQXh)YAp+y{gG(0UMm(Ur z3o3n36oFwCkn+H*GZ-c6$Y!5r3z*@z0`NrB2C^q#LkOuooUM8Oek2KBk}o1PU8&2L z4iNkb5CqJWs58aR394iCU^ImDqV;q_Pp?pl=RB2372(Io^GA^+oKguO1(x$0<7w3z z)j{vnqEB679Rz4i4t;8|&Zg77UrklxY9@GDq(ZphH6=sW`;@uIt5B?7Oi?A0-BL}(#1&R;>2aFdq+E{jsvpNHjLx2t{@g1}c~DQcPNmVmy| zNMO@ewD^+T!|!DCOf}s9dLJU}(KZy@Jc&2Nq3^;vHTs}Hgcp`cw&gd7#N}nAFe3cM1TF%vKbKSffd&~FG9y$gLyr{#to)nxz5cCASEzQ}gz8O)phtHuKOW6p z@EQF(R>j%~P63Wfosrz8p(F=D|Mff~chUGn(<=CQbSiZ{t!e zeDU-pPsLgtc#d`3PYr$i*AaT!zF#23htIG&?QfcUk+@k$LZI}v+js|yuGmE!PvAV3 ztzh90rK-0L6P}s?1QH`Ot@ilbgMBzWIs zIs6K<_NL$O4lwR%zH4oJ+}JJp-bL6~%k&p)NGDMNZX7)0kni&%^sH|T?A)`z z=adV?!qnWx^B$|LD3BaA(G=ePL1+}8iu^SnnD;VE1@VLHMVdSN9$d)R(Wk{JEOp(P zm3LtAL$b^*JsQ0W&eLaoYag~=fRRdI>#FaELCO7L>zXe6w*nxN$Iy*Q*ftHUX0+N- zU>{D_;RRVPbQ?U+$^%{lhOMKyE5>$?U1aEPist+r)b47_LehJGTu>TcgZe&J{ z{q&D{^Ps~z7|zj~rpoh2I_{gAYNoCIJmio3B}$!5vTF*h$Q*vFj~qbo%bJCCRy509 zHTdDh_HYH8Zb9`}D5;;J9fkWOQi%Y$B1!b9+ESj+B@dtAztlY2O3NE<6HFiqOF&p_ zW-K`KiY@RPSY-p9Q99}Hcd05DT79_pfb{BV7r~?9pWh=;mcKBLTen%THFPo2NN~Nf zriOtFnqx}rtO|A6k!r6 zf-z?y-UD{dT0kT9FJ`-oWuPHbo+3wBS(}?2ql(+e@VTExmfnB*liCb zmeI+v5*+W_L;&kQN^ChW{jE0Mw#0Tfs}`9bk3&7UjxP^Ke(%eJu2{VnW?tu7Iqecm zB5|=-QdzK$=h50~{X3*w4%o1FS_u(dG2s&427$lJ?6bkLet}yYXCy)u_Io1&g^c#( z-$yYmSpxz{>BL;~c+~sxJIe1$7eZI_9t`eB^Pr0)5CuA}w;;7#RvPq|H6!byRzIJG ziQ7a4y_vhj(AL`8PhIm9edCv|%TX#f50lt8+&V+D4<}IA@S@#f4xId80oH$!_!q?@ zFRGGg2mTv&@76P7aTI{)Hu%>3QS_d)pQ%g8BYi58K~m-Ov^7r8BhX7YC1D3vwz&N8{?H*_U7DI?CI)+et?q|eGu>42NJ?K4SY zD?kc>h@%4IqNYuQ8m10+8xr2HYg2qFNdJl=Tmp&ybF>1>pqVfa%SsV*BY$d6<@iJA ziyvKnZ(~F9xQNokBgMci#pnZ}Igh0@S~cYcU_2Jfuf|d3tuH?ZSSYBfM(Y3-JBsC|S9c;# zyIMkPxgrq};0T09pjj#X?W^TFCMf1-9P{)g88;NDI+S4DXe>7d3Mb~i-h&S|Jy{J< zq3736$bH?@{!amD!1Ys-X)9V=#Z={fzsjVYMX5BG6%}tkzwC#1nQLj1y1f#}8**4Y zAvDZHw8)N)8~oWC88CgzbwOrL9HFbk4}h85^ptuu7A+uc#$f^9`EWv1Vr{5+@~@Uv z#B<;-nt;)!k|fRIg;2DZ(A2M2aC65kOIov|?Mhi1Sl7YOU4c$T(DoRQIGY`ycfkn% zViHzL;E*A{`&L?GP06Foa38+QNGA zw3+Wqs(@q+H{XLJbwZzE(omw%9~LPZfYB|NF5%j%E5kr_xE0u;i?IOIchn~VjeDZ) zAqsqhP0vu2&Tbz3IgJvMpKbThC-@=nk)!|?MIPP>MggZg{cUcKsP8|N#cG5 zUXMXxcXBF9`p>09IR?x$Ry3;q@x*%}G#lnB1}r#!WL88I@uvm}X98cZ8KO&cqT1p> z+gT=IxPsq%n4GWgh-Bk8E4!~`r@t>DaQKsjDqYc&h$p~TCh8_Mck5UB84u6Jl@kUZCU9BA-S!*bf>ZotFX9?a_^y%)yH~rsAz0M5#^Di80_tgoKw(egN z`)#(MqAI&A84J#Z<|4`Co8`iY+Cv&iboMJ^f9ROUK0Lm$;-T*c;TCTED_0|qfhlcS zv;BD*$Zko#nWPL}2K8T-?4}p{u)4xon!v_(yVW8VMpxg4Kh^J6WM{IlD{s?%XRT8P|yCU`R&6gwB~ zg}{At!iWCzOH37!ytcPeC`(({ovP7M5Y@bYYMZ}P2Z3=Y_hT)4DRk}wfeIo%q*M9UvXYJq!-@Ly79m5aLD{hf@BzQB>FdQ4mw z6$@vzSKF^Gnzc9vbccii)==~9H#KW<6)Uy1wb~auBn6s`ct!ZEos`WK8e2%<00b%# zY9Nvnmj@V^K(a_38dw-S*;G-(i(ETuIwyirs?$FFW@|66a38k+a%GLmucL%Wc8qk3 z?h_4!?4Y-xt)ry)>J`SuY**fuq2>u+)VZ+_1Egzctb*xJ6+7q`K$^f~r|!i?(07CD zH!)C_uerf-AHNa?6Y61D_MjGu*|wcO+ZMOo4q2bWpvjEWK9yASk%)QhwZS%N2_F4& z16D18>e%Q1mZb`R;vW{+IUoKE`y3(7p zplg5cBB)dtf^SdLd4n60oWie|(ZjgZa6L*VKq02Aij+?Qfr#1z#fwh92aV-HGd^_w zsucG24j8b|pk>BO7k8dS86>f-jBP^Sa}SF{YNn=^NU9mLOdKcAstv&GV>r zLxKHPkFxpvE8^r@MSF6UA}cG`#yFL8;kA7ccH9D=BGBtW2;H>C`FjnF^P}(G{wU;G z!LXLCbPfsGeLCQ{Ep$^~)@?v`q(uI`CxBY44osPcq@(rR-633!qa zsyb>?v%@X+e|Mg`+kRL*(;X>^BNZz{_kw5+K;w?#pReiw7eU8_Z^hhJ&fj80XQkuU z39?-z)6Fy$I`bEiMheS(iB6uLmiMd1i)cbK*9iPpl+h4x9ch7x- z1h4H;W_G?|)i`z??KNJVwgfuAM=7&Apd3vm#AT8uzQZ!NII}}@!j)eIfn53h{NmN7 zAKG6SnKP%^k&R~m5#@_4B@V?hYyHkm>0SQ@PPiw*@Tp@UhP-?w@jW?nxXuCipMW=L zH*5l*d@+jXm0tIMP_ec6Jcy6$w(gKK@xBX8@%oPaSyG;13qkFb*LuVx3{AgIyy&n3 z@R2_DcEn|75_?-v5_o~%xEt~ONB>M~tpL!nOVBLPN&e5bn5>+7o0?Nm|EGJ5 zmUbF{u|Qn?cu5}n4@9}g(G1JxtzkKv(tqwm_?1`?YSVA2IS4WI+*(2D*wh&6MIEhw z+B+2U<&E&|YA=3>?^i6)@n1&&;WGHF-pqi_sN&^C9xoxME5UgorQ_hh1__zzR#zVC zOQt4q6>ME^iPJ37*(kg4^=EFqyKH@6HEHXy79oLj{vFqZGY?sVjk!BX^h$SFJlJnv z5uw~2jLpA)|0=tp>qG*tuLru?-u`khGG2)o{+iDx&nC}eWj3^zx|T`xn5SuR;Aw8U z`p&>dJw`F17@J8YAuW4=;leBE%qagVTG5SZdh&d)(#ZhowZ|cvWvGMMrfVsbg>_~! z19fRz8CSJdrD|Rl)w!uznBF&2-dg{>y4l+6(L(vzbLA0Bk&`=;oQQ>(M8G=3kto_) zP8HD*n4?MySO2YrG6fwSrVmnesW+D&fxjfEmp=tPd?RKLZJcH&K(-S+x)2~QZ$c(> zru?MND7_HPZJVF%wX(49H)+~!7*!I8w72v&{b={#l9yz+S_aVPc_So%iF8>$XD1q1 zFtucO=rBj0Ctmi0{njN8l@}!LX}@dwl>3yMxZ;7 z0Ff2oh8L)YuaAGOuZ5`-p%Z4H@H$;_XRJQ|&(MhO78E|nyFa158gAxG^SP(vGi^+< zChY}o(_=ci3Wta#|K6MVljNe0T$%Q5ylx-v`R)r8;3+VUpp-)7T`-Y&{Zk z*)1*2MW+_eOJtF5tCMDV`}jg-R(_IzeE9|MBKl;a7&(pCLz}5<Zf+)T7bgNUQ_!gZtMlw=8doE}#W+`Xp~1DlE=d5SPT?ymu!r4z%&#A-@x^=QfvDkfx5-jz+h zoZ1OK)2|}_+UI)i9%8sJ9X<7AA?g&_Wd7g#rttHZE;J*7!e5B^zdb%jBj&dUDg4&B zMMYrJ$Z%t!5z6=pMGuO-VF~2dwjoXY+kvR>`N7UYfIBMZGP|C7*O=tU z2Tg_xi#Q3S=1|=WRfZD;HT<1D?GMR%5kI^KWwGrC@P2@R>mDT^3qsmbBiJc21kip~ zZp<7;^w{R;JqZ)C4z-^wL=&dBYj9WJBh&rd^A^n@07qM$c+kGv^f+~mU5_*|eePF| z3wDo-qaoRjmIw<2DjMTG4$HP{z54_te_{W^gu8$r=q0JgowzgQPct2JNtWPUsjF8R zvit&V8$(;7a_m%%9TqPkCXYUp&k*MRcwr*24>hR! z$4c#E=PVE=P4MLTUBM z7#*RDe0}=B)(3cvNpOmWa*eH#2HR?NVqXdJ=hq);MGD07JIQQ7Y0#iD!$C+mk7x&B zMwkS@H%>|fmSu#+ zI!}Sb(%o29Vkp_Th>&&!k7O>Ba#Om~B_J{pT7BHHd8(Ede(l`7O#`_}19hr_?~JP9 z`q(`<)y>%)x;O7)#-wfCP{?llFMoH!)ZomgsOYFvZ1DxrlYhkWRw#E-#Qf*z@Y-EQ z1~?_=c@M4DO@8AzZ2hKvw8CgitzI9yFd&N1-{|vP#4IqYb*#S0e3hrjsEGlnc4xwk z4o!0rxpUt8j&`mJ8?+P8G{m^jbk)bo_UPM+ifW*y-A*et`#_Ja_3nYyRa9fAG1Xr5 z>#AM_@PY|*u)DGRWJihZvgEh#{*joJN28uN7;i5{kJ*Gb-TERfN{ERe_~$Es~NJCpdKLRvdj4658uYYx{ng7I<6j~w@p%F<7a(Ssib|j z51;=Py(Nu*#hnLx@w&8X%=jrADn3TW>kplnb zYbFIWWVQXN7%Cwn6KnR)kYePEBmvM45I)UJb$)ninpdYg3a5N6pm_7Q+9>!_^xy?k za8@tJ@OOs-pRAAfT>Nc2x=>sZUs2!9Dwa%TTmDggH4fq(x^MW>mcRyJINlAqK$YQCMgR8`>6=Sg$ zFnJZsA8xUBXIN3i70Q%8px@yQPMgVP=>xcPI38jNJK<=6hC={a07+n@R|$bnhB)X$ z(Zc%tadp70vBTnW{OUIjTMe38F}JIH$#A}PB&RosPyFZMD}q}5W%$rh>5#U;m`z2K zc(&WRxx7DQLM-+--^w*EWAIS%bi>h587qkwu|H=hma3T^bGD&Z!`u(RKLeNZ&pI=q$|HOcji(0P1QC!YkAp*u z3%S$kumxR}jU<@6`;*-9=5-&LYRA<~uFrwO3U0k*4|xUTp4ZY7;Zbjx|uw&BWU$zK(w55pWa~#=f$c zNDW0O68N!xCy>G}(CX=;8hJLxAKn@Aj(dbZxO8a$+L$jK8$N-h@4$i8)WqD_%Snh4 zR?{O%k}>lr>w$b$g=VP8mckcCrjnp>uQl5F_6dPM8FWRqs}h`DpfCv20uZhyY~tr8 zkAYW4#yM;*je)n=EAb(q@5BWD8b1_--m$Q-3wbh1hM{8ihq7UUQfg@)l06}y+#=$( z$x>oVYJ47zAC^>HLRE-!HitjUixP6!R98WU+h>zct7g4eD;Mj#FL*a!VW!v-@b(Jv zj@@xM5noCp5%Vk3vY{tyI#oyDV7<$`KG`tktVyC&0DqxA#>V;-3oH%NW|Q&=UQ&zU zXNIT67J4D%5R1k#bW0F}TD`hlW7b)-=-%X4;UxQ*u4bK$mTAp%y&-(?{sXF%e_VH6 zTkt(X)SSN|;8q@8XX6qfR;*$r#HbIrvOj*-5ND8RCrcw4u8D$LXm5zlj@E5<3S0R# z??=E$p{tOk96$SloZ~ARe5`J=dB|Nj?u|zy2r(-*(q^@YwZiTF@QzQyPx_l=IDKa) zqD@0?IHJqSqZ_5`)81?4^~`yiGh6>7?|dKa8!e|}5@&qV!Iu9<@G?E}Vx9EzomB3t zEbMEm$TKGwkHDpirp;FZD#6P5qIlQJ8}rf;lHoz#h4TFFPYmS3+8(13_Mx2`?^=8S z|0)0&dQLJTU6{b%*yrpQe#OKKCrL8}YKw+<#|m`SkgeoN69TzIBQOl_Yg)W*w?NW) z*WxhEp$zQBBazJSE6ygu@O^!@Fr46j=|K`Mmb~xbggw7<)BuC@cT@Bwb^k?o-A zKX^9AyqR?zBtW5UA#siILztgOp?r4qgC`9jYJG_fxlsVSugGprremg-W(K0{O!Nw-DN%=FYCyfYA3&p*K>+|Q}s4rx#CQK zNj^U;sLM#q8}#|PeC$p&jAjqMu(lkp-_50Y&n=qF9`a3`Pr9f;b`-~YZ+Bb0r~c+V z*JJ&|^T{}IHkwjNAaM^V*IQ;rk^hnnA@~?YL}7~^St}XfHf6OMMCd9!vhk#gRA*{L zp?&63axj|Si%^NW05#87zpU_>QpFNb+I00v@cHwvdBn+Un)n2Egdt~LcWOeBW4Okm zD$-e~RD+W|UB;KQ;a7GOU&%p*efGu2$@wR74+&iP8|6#_fmnh^WcJLs)rtz{46);F z4v0OL{ZP9550>2%FE(;SbM*#sqMl*UXOb>ch`fJ|(*bOZ9=EB1+V4fkQ)hjsm3-u^Pk-4ji_uDDHdD>84tER!MvbH`*tG zzvbhBR@}Yd`azQGavooV=<WbvWLlO#x`hyO34mKcxrGv=`{ssnP=0Be5#1B;Co9 zh{TR>tjW2Ny$ZxJpYeg57#0`GP#jxDCU0!H15nL@@G*HLQcRdcsUO3sO9xvtmUcc{F*>FQZcZ5bgwaS^k-j5mmt zI7Z{Xnoml|A(&_{imAjK!kf5>g(oDqDI4C{;Bv162k8sFNr;!qPa2LPh>=1n z=^_9)TsLDvTqK7&*Vfm5k;VXjBW^qN3Tl&}K=X5)oXJs$z3gk0_+7`mJvz{pK|FVs zHw!k&7xVjvY;|(Py<;J{)b#Yjj*LZO7x|~pO4^MJ2LqK3X;Irb%nf}L|gck zE#55_BNsy6m+W{e zo!P59DDo*s@VIi+S|v93PwY6d?CE=S&!JLXwE9{i)DMO*_X90;n2*mPDrL%{iqN!?%-_95J^L z=l<*{em(6|h7DR4+4G3Wr;4*}yrBkbe3}=p7sOW1xj!EZVKSMSd;QPw>uhKK z#>MlS@RB@-`ULv|#zI5GytO{=zp*R__uK~R6&p$q{Y{iNkg61yAgB8C^oy&``{~FK z8hE}H&nIihSozKrOONe5Hu?0Zy04U#0$fB7C6y~?8{or}KNvP)an=QP&W80mj&8WL zEZQF&*FhoMMG6tOjeiCIV;T{I>jhi9hiUwz?bkX3NS-k5eWKy)Mo_orMEg4sV6R6X&i-Q%JG;Esl+kLpn@Bsls9O|i9z`tKB^~1D5)RIBB&J<6T@a4$pUvh$IR$%ubH)joi z!7>ON0DPwx=>0DA>Bb^c?L8N0BBrMl#oDB+GOXJh;Y&6I)#GRy$W5xK%a;KS8BrER zX)M>Rdoc*bqP*L9DDA3lF%U8Yzb6RyIsW@}IKq^i7v&{LeIc=*ZHIbO68x=d=+0T( zev=DT9f|x!IWZNTB#N7}V4;9#V$%Wo0%g>*!MdLOEU>My0^gni9ocID{$g9ytD!gy zKRWT`DVN(lcYjR|(}f0?zgBa3SwunLfAhx><%u0uFkrdyqlh8_g zDKt#R6rA2(Vm2LW_>3lBNYKG_F{TEnnKWGGC15y&OebIRhFL4TeMR*v9i0wPoK#H< zu4){s4K&K)K(9~jgGm;H7lS7y_RYfS;&!Oj5*eqbvEcW^a*i67nevzOZxN6F+K~A%TYEtsAVsR z@J=1hc#Dgs7J2^FL|qV&#WBFQyDtEQ2kPO7m2`)WFhqAob)Y>@{crkil6w9VoA?M6 zADGq*#-hyEVhDG5MQj677XmcWY1_-UO40QEP&+D)rZoYv^1B_^w7zAvWGw&pQyCyx zD|ga$w!ODOxxGf_Qq%V9Z7Q2pFiUOIK818AGeZ-~*R zI1O|SSc=3Z?#61Rd|AXx2)K|F@Z1@x!hBBMhAqiU)J=U|Y)T$h3D?ZPPQgkSosnN! zIqw-t$0fqsOlgw3TlHJF*t$Q@bg$9}A3X=cS@-yU3_vNG_!#9}7=q7!LZ?-%U26W4 z$d>_}*s1>Ac%3uFR;tnl*fNlylJ)}r2^Q3&@+is3BIv<}x>-^_ng;jhdaM}6Sg3?p z0jS|b%QyScy3OQ(V*~l~bK>VC{9@FMuW_JUZO?y(V?LKWD6(MXzh}M3r3{7b4eB(#`(q1m{>Be%_<9jw8HO!x#yF6vez$c#kR+}s zZO-_;25Sxngd(}){zv?ccbLqRAlo;yog>4LH&uZUK1n>x?u49C)Y&2evH5Zgt~666 z_2_z|H5AO5Iqxv_Bn~*y1qzRPcob<+Otod5Xd2&z=C;u+F}zBB@b^UdGdUz|s!H}M zXG%KiLzn3G?FZgdY&3pV$nSeY?ZbU^jhLz9!t0K?ep}EFNqR1@E!f*n>x*!uO*~JF zW9UXWrVgbX1n#76_;&0S7z}(5n-bqnII}_iDsNqfmye@)kRk`w~1 z6j4h4BxcPe6}v)xGm%=z2#tB#^KwbgMTl2I*$9eY|EWAHFc3tO48Xo5rW z5oHD!G4kb?MdrOHV=A+8ThlIqL8Uu+7{G@ zb)cGBm|S^Eh5= z^E^SZ=yeC;6nNCdztw&TdnIz}^Of@Ke*@vjt)0g>Y!4AJvWiL~e7+9#Ibhe)> ziNwh>gWZL@FlWc)wzihocz+%+@*euwXhW%Hb>l7tf8aJe5_ZSH1w-uG|B;9qpcBP0 zM`r1Hu#htOl)4Cl1c7oY^t0e4Jh$-I(}M5kzWqh{F=g&IM#JiC`NDSd@BCKX#y<P@Gwl$3a3w z6<(b|K(X5FIR22M)sy$4jY*F4tT{?wZRI+KkZFb<@j@_C316lu1hq2hA|1wCmR+S@ zRN)YNNE{}i_H`_h&VUT5=Y(lN%m?%QX;6$*1P}K-PcPx>*S55v)qZ@r&Vcic-sjkm z! z=nfW&X`}iAqa_H$H%z3Tyz5&P3%+;93_0b;zxLs)t#B|up}JyV$W4~`8E@+BHQ+!y zuIo-jW!~)MN$2eHwyx-{fyGjAWJ(l8TZtUp?wZWBZ%}krT{f*^fqUh+ywHifw)_F> zp76_kj_B&zFmv$FsPm|L7%x-j!WP>_P6dHnUTv!9ZWrrmAUteBa`rT7$2ixO;ga8U z3!91micm}{!Btk+I%pMgcKs?H4`i+=w0@Ws-CS&n^=2hFTQ#QeOmSz6ttIkzmh^`A zYPq)G1l3h(E$mkyr{mvz*MP`x+PULBn%CDhltKkNo6Uqg!vJ#DA@BIYr9TQ`18Un2 zv$}BYzOQuay9}w(?JV63F$H6WmlYPPpH=R|CPb%C@BCv|&Q|&IcW7*LX?Q%epS z`=CPx{1HnJ9_46^=0VmNb>8JvMw-@&+V8SDLRYsa>hZXEeRbtf5eJ>0@Ds47zIY{N z42EOP9J8G@MXXdeiPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?lu1NER9Fe^SItioK@|V(ZWmgL zZT;XwPgVuWM>O%^|Dc$VK;n&?9!&g5)aVsG8cjs5UbtxVVnQNOV~7Mrg3+jnU;rhE z6fhW6P)R>_eXrXo-RW*y6RQ_qcb^s1wTu$TwriZ`=JUws>vRi}5x}MW1MR#7p|gIWJlaLK;~xaN}b< z<-@=RX-%1mt`^O0o^~2=CD7pJ<<$Rp-oUL-7PuG>do^5W_Mk#unlP}6I@6NPxY`Q} zuXJF}!0l)vwPNAW;@5DjPRj?*rZxl zwn;A(cFV!xe^CUu+6SrN?xe#mz?&%N9QHf~=KyK%DoB8HKC)=w=3E?1Bqj9RMJs3U z5am3Uv`@+{jgqO^f}Lx_Jp~CoP3N4AMZr~4&d)T`R?`(M{W5WWJV^z~2B|-oih@h^ zD#DuzGbl(P5>()u*YGo*Och=oRr~3P1wOlKqI)udc$|)(bacG5>~p(y>?{JD7nQf_ z*`T^YL06-O>T(s$bi5v~_fWMfnE7Vn%2*tqV|?~m;wSJEVGkNMD>+xCu#um(7}0so zSEu7?_=Q64Q5D+fz~T=Rr=G_!L*P|(-iOK*@X8r{-?oBlnxMNNgCVCN9Y~ocu+?XA zjjovJ9F1W$Nf!{AEv%W~8oahwM}4Ruc+SLs>_I_*uBxdcn1gQ^2F8a*vGjgAXYyh? zWCE@c5R=tbD(F4nL9NS?$PN1V_2*WR?gjv3)4MQeizuH`;sqrhgykEzj z593&TGlm3h`sIXy_U<7(dpRXGgp0TB{>s?}D{fwLe>IV~exweOfH!qM@CV5kib!YA z6O0gvJi_0J8IdEvyP#;PtqP*=;$iI2t(xG2YI-e!)~kaUn~b{6(&n zp)?iJ`z2)Xh%sCV@BkU`XL%_|FnCA?cVv@h*-FOZhY5erbGh)%Q!Av#fJM3Csc_g zC2I6x%$)80`Tkz#KRA!h1FzY`?0es3t!rKDT5EjPe6B=BLPr7s0GW!if;Ip^!AmGW zL;$`Vdre+|FA!I4r6)keFvAx3M#1`}ijBHDzy)3t0gwjl|qC2YB`SSxFKHr(oY#H$)x{L$LL zBdLKTlsOrmb>T0wd=&6l3+_Te>1!j0OU8%b%N342^opKmT)gni(wV($s(>V-fUv@0p8!f`=>PxC|9=nu ze{ToBBj8b<{PLfXV$h8YPgA~E!_sF9bl;QOF{o6t&JdsX?}rW!_&d`#wlB6T_h;Xf zl{4Tz5>qjF4kZgjO7ZiLPRz_~U@k5%?=30+nxEh9?s78gZ07YHB`FV`4%hlQlMJe@J`+e(qzy+h(9yY^ckv_* zb_E6o4p)ZaWfraIoB2)U7_@l(J0O%jm+Or>8}zSSTkM$ASG^w3F|I? z$+eHt7T~04(_WfKh27zqS$6* zzyy-ZyqvSIZ0!kkSvHknm_P*{5TKLQs8S6M=ONuKAUJWtpxbL#2(_huvY(v~Y%%#~ zYgsq$JbLLprKkV)32`liIT$KKEqs$iYxjFlHiRNvBhxbDg*3@Qefw4UM$>i${R5uB zhvTgmqQsKA{vrKN;TSJU2$f9q=y{$oH{<)woSeV>fkIz6D8@KB zf4M%v%f5U2?<8B(xn}xV+gWP?t&oiapJhJbfa;agtz-YM7=hrSuxl8lAc3GgFna#7 zNjX7;`d?oD`#AK+fQ=ZXqfIZFEk{ApzjJF0=yO~Yj{7oQfXl+6v!wNnoqwEvrs81a zGC?yXeSD2NV!ejp{LdZGEtd1TJ)3g{P6j#2jLR`cpo;YX}~_gU&Gd<+~SUJVh+$7S%`zLy^QqndN<_9 zrLwnXrLvW+ew9zX2)5qw7)zIYawgMrh`{_|(nx%u-ur1B7YcLp&WFa24gAuw~& zKJD3~^`Vp_SR$WGGBaMnttT)#fCc^+P$@UHIyBu+TRJWbcw4`CYL@SVGh!X&y%!x~ zaO*m-bTadEcEL6V6*{>irB8qT5Tqd54TC4`h`PVcd^AM6^Qf=GS->x%N70SY-u?qr>o2*OV7LQ=j)pQGv%4~z zz?X;qv*l$QSNjOuQZ>&WZs2^@G^Qas`T8iM{b19dS>DaXX~=jd4B2u`P;B}JjRBi# z_a@&Z5ev1-VphmKlZEZZd2-Lsw!+1S60YwW6@>+NQ=E5PZ+OUEXjgUaXL-E0fo(E* zsjQ{s>n33o#VZm0e%H{`KJi@2ghl8g>a~`?mFjw+$zlt|VJhSU@Y%0TWs>cnD&61fW4e0vFSaXZa4-c}U{4QR8U z;GV3^@(?Dk5uc@RT|+5C8-24->1snH6-?(nwXSnPcLn#X_}y3XS)MI_?zQ$ZAuyg+ z-pjqsw}|hg{$~f0FzmmbZzFC0He_*Vx|_uLc!Ffeb8#+@m#Z^AYcWcZF(^Os8&Z4g zG)y{$_pgrv#=_rV^D|Y<_b@ICleUv>c<0HzJDOsgJb#Rd-Vt@+EBDPyq7dUM9O{Yp zuGUrO?ma2wpuJuwl1M=*+tb|qx7Doj?!F-3Z>Dq_ihFP=d@_JO;vF{iu-6MWYn#=2 zRX6W=`Q`q-+q@Db|6_a1#8B|#%hskH82lS|9`im0UOJn?N#S;Y0$%xZw3*jR(1h5s z?-7D1tnIafviko>q6$UyqVDq1o@cwyCb*})l~x<@s$5D6N=-Uo1yc49p)xMzxwnuZ zHt!(hu-Ek;Fv4MyNTgbW%rPF*dB=;@r3YnrlFV{#-*gKS_qA(G-~TAlZ@Ti~Yxw;k za1EYyX_Up|`rpbZ0&Iv#$;eC|c0r4XGaQ-1mw@M_4p3vKIIpKs49a8Ns#ni)G314Z z8$Ei?AhiT5dQGWUYdCS|IC7r z=-8ol>V?u!n%F*J^^PZ(ONT&$Ph;r6X;pj|03HlDY6r~0g~X#zuzVU%a&!fs_f|m?qYvg^Z{y?9Qh7Rn?T*F%7lUtA6U&={HzhYEzA`knx1VH> z{tqv?p@I(&ObD5L4|YJV$QM>Nh-X3cx{I&!$FoPC_2iIEJfPk-$;4wz>adRu@n`_y z_R6aN|MDHdK;+IJmyw(hMoDCFCQ(6?hCAG5&7p{y->0Uckv# zvooVuu04$+pqof777ftk<#42@KQ((5DPcSMQyzGOJ{e9H$a9<2Qi_oHjl{#=FUL9d z+~0^2`tcvmp0hENwfHR`Ce|<1S@p;MNGInXCtHnrDPXCKmMTZQ{HVm_cZ>@?Wa6}O zHsJc7wE)mc@1OR2DWY%ZIPK1J2p6XDO$ar`$RXkbW}=@rFZ(t85AS>>U0!yt9f49^ zA9@pc0P#k;>+o5bJfx0t)Lq#v4`OcQn~av__dZ-RYOYu}F#pdsl31C^+Qgro}$q~5A<*c|kypzd} ziYGZ~?}5o`S5lw^B{O@laad9M_DuJle- z*9C7o=CJh#QL=V^sFlJ0c?BaB#4bV^T(DS6&Ne&DBM_3E$S^S13qC$7_Z?GYXTpR@wqr70wu$7+qvf-SEUa5mdHvFbu^7ew!Z1a^ zo}xKOuT*gtGws-a{Tx}{#(>G~Y_h&5P@Q8&p!{*s37^QX_Ibx<6XU*AtDOIvk|^{~ zPlS}&DM5$Ffyu-T&0|KS;Wnaqw{9DB&B3}vcO14wn;)O_e@2*9B&0I_ zZz{}CMxx`hv-XouY>^$Y@J(_INeM>lIQI@I>dBAqq1)}?Xmx(qRuX^i4IV%=MF306 z9g)i*79pP%_7Ex?m6ag-4Tlm=Z;?DQDyC-NpUIb#_^~V_tsL<~5<&;Gf2N+p?(msn zzUD~g>OoW@O}y0@Z;RN)wjam`CipmT&O7a|YljZqU=U86 zedayEdY)2F#BJ6xvmW8K&ffdS*0!%N<%RB!2~PAT4AD*$W7yzHbX#Eja9%3aD+Ah2 zf#T;XJW-GMxpE=d4Y>}jE=#U`IqgSoWcuvgaWQ9j1CKzG zDkoMDDT)B;Byl3R2PtC`ip=yGybfzmVNEx{xi_1|Cbqj>=FxQc{g`xj6fIfy`D8fA z##!-H_e6o0>6Su&$H2kQTujtbtyNFeKc}2=|4IfLTnye#@$Au7Kv4)dnA;-fz@D_8 z)>irG$)dkBY~zX zC!ZXLy*L3xr6cb70QqfN#Q>lFIc<>}>la4@3%7#>a1$PU&O^&VszpxLC%*!m-cO{B z-Y}rQr4$84(hvy#R69H{H zJ*O#uJh)TF6fbXy;fZkk%X=CjsTK}o5N1a`d7kgYYZLPxsHx%9*_XN8VWXEkVJZ%A z1A+5(B;0^{T4aPYr8%i@i32h)_)|q?9vws)r+=5u)1YNftF5mknwfd*%jXA2TeP}Z zQ!m?xJ3?9LpPM?_A3$hQ1QxNbR&}^m z!F999s?p^ak#C4NM_x2p9FoXWJ$>r?lJ)2bG)sX{gExgLA2s5RwHV!h6!C~d_H||J z>9{E{mEv{Z1z~65Vix@dqM4ZqiU|!)eWX$mwS5mLSufxbpBqqS!jShq1bmwCR6 z4uBri7ezMeS6ycaXPVu(i2up$L; zjpMtB`k~WaNrdgM_R=e#SN?Oa*u%nQy01?()h4A(jyfeNfx;5o+kX?maO4#1A^L}0 zYNyIh@QVXIFiS0*tE}2SWTrWNP3pH}1Vz1;E{@JbbgDFM-_Mky^7gH}LEhl~Ve5PexgbIyZ(IN%PqcaV@*_`ZFb=`EjspSz%5m2E34BVT)d=LGyHVz@-e%9Ova*{5@RD;7=Ebkc2GP%pIP^P7KzKapnh`UpH?@h z$RBpD*{b?vhohOKf-JG3?A|AX|2pQ?(>dwIbWhZ38GbTm4AImRNdv_&<99ySX;kJ| zo|5YgbHZC#HYgjBZrvGAT4NZYbp}qkVSa;C-LGsR26Co+i_HM&{awuO9l)Ml{G8zD zs$M8R`r+>PT#Rg!J(K6T4xHq7+tscU(}N$HY;Yz*cUObX7J7h0#u)S7b~t^Oj}TBF zuzsugnst;F#^1jm>22*AC$heublWtaQyM6RuaquFd8V#hJ60Z3j7@bAs&?dD#*>H0SJaDwp%U~27>zdtn+ z|8sZzklZy$%S|+^ie&P6++>zbrq&?+{Yy11Y>@_ce@vU4ZulS@6yziG6;iu3Iu`M= zf3rcWG<+3F`K|*(`0mE<$89F@jSq;j=W#E>(R}2drCB7D*0-|D;S;(;TwzIJkGs|q z2qH{m_zZ+el`b;Bv-#bQ>}*VPYC|7`rgBFf2oivXS^>v<&HHTypvd4|-zn|=h=TG{ z05TH2+{T%EnADO>3i|CB zCu60#qk`}GW{n4l-E$VrqgZGbI zbQW690KgZt4U3F^5@bdO1!xu~p@7Y~*_FfWg2CdvED5P5#w#V46LH`<&V0{t&Ml~4 zHNi7lIa+#i+^Z6EnxO7KJQw)wD)4~&S-Ki8)3=jpqxmx6c&zU&<&h%*c$I(5{1HZT zc9WE}ijcWJiVa^Q^xC|WX0habl89qycOyeViIbi(LFsEY_8a|+X^+%Qv+W4vzj>`y zpuRnjc-eHNkvXvI_f{=*FX=OKQzT?bck#2*qoKTHmDe>CDb&3AngA1O)1b}QJ1Tun z_<@yVEM>qG7664Pa@dzL@;DEh`#?yM+M|_fQS<7yv|i*pw)|Z8)9IR+QB7N3v3K(wv4OY*TXnH&X0nQB}?|h2XQeGL^q~N7N zDFa@x0E(UyN7k9g%IFq7Sf+EAfE#K%%#`)!90_)Dmy3Bll&e1vHQyPA87TaF(xbqMpDntVp?;8*$87STop$!EAnGhZ?>mqPJ(X zFsr336p3P{PpZCGn&^LP(JjnBbl_3P3Kcq+m}xVFMVr1zdCPJMDIV_ki#c=vvTwbU z*gKtfic&{<5ozL6Vfpx>o2Tts?3fkhWnJD&^$&+Mh5WGGyO7fG@6WDE`tEe(8<;+q z@Ld~g08XDzF8xtmpIj`#q^(Ty{Hq>t*v`pedHnuj(0%L(%sjkwp%s}wMd!a<*L~9T z9MM@s)Km~ogxlqEhIw5(lc46gCPsSosUFsgGDr8H{mj%OzJz{N#;bQ;KkV+ZWA1(9 zu0PXzyh+C<4OBYQ0v3z~Lr;=C@qmt8===Ov2lJ1=DeLfq*#jgT{YQCuwz?j{&3o_6 zsqp2Z_q-YWJg?C6=!Or|b@(zxTlg$ng2eUQzuC<+o)k<6^9ju_Z*#x+oioZ5T8Z_L zz9^A1h2eFS0O5muq8;LuDKwOv4A9pxmOjgb6L*i!-(0`Ie^d5Fsgspon%X|7 zC{RRXEmYn!5zP9XjG*{pLa)!2;PJB2<-tH@R7+E1cRo=Wz_5Ko8h8bB$QU%t9#vol zAoq?C$~~AsYC|AQQ)>>7BJ@{Cal)ZpqE=gjT+Juf!RD-;U0mbV1ED5PbvFD6M=qj1 zZ{QERT5@(&LQ~1X9xSf&@%r|3`S#ZCE=sWD`D4YQZ`MR`G&s>lN{y2+HqCfvgcw3E z-}Kp(dfGG?V|97kAHQX+OcKCZS`Q%}HD6u*e$~Ki&Vx53&FC!x94xJd4F2l^qQeFO z?&JdmgrdVjroKNJx64C!H&Vncr^w zzR#XI}Dn&o8jB~_YlVM^+#0W(G1LZH5K^|uYT@KSR z^Y5>^*Bc45E1({~EJB(t@4n9gb-eT#s@@7)J^^<_VV`Pm!h7av8XH6^5zO zOcQBhTGr;|MbRsgxCW69w{bl4EW#A~);L?d4*y#j8Ne=Z@fmJP0k4{_cQ~KA|Y#_#BuUiYx8y*za3_6Y}c=GSe7(2|KAfhdzud!Zq&}j)=o4 z7R|&&oX7~e@~HmyOOsCCwy`AR+deNjZ3bf6ijI_*tKP*_5JP3;0d;L_p(c>W1b%sG zJ*$wcO$ng^aW0E(5ldckV9unU7}OB7s?Wx(761?1^&8tA5y0_(ieV>(x-e@}1`lWC z-YH~G$D>#ud!SxK2_Iw{K%92=+{4yb-_XC>ji&j7)1ofp(OGa4jjF;Hd*`6YQL+Jf zffg+6CPc8F@EDPN{Kn96yip;?g@)qgkPo^nVKFqY?8!=h$G$V=<>%5J&iVjwR!7H0 z$@QL|_Q81I;Bnq8-5JyNRv$Y>`sWl{qhq>u+X|)@cMlsG!{*lu?*H`Tp|!uv z9oEPU1jUEj@ueBr}%Y)7Luyi)REaJV>eQ{+uy4uh0ep0){t;OU8D*RZ& zE-Z-&=BrWQLAD^A&qut&4{ZfhqK1ZQB0fACP)=zgx(0(o-`U62EzTkBkG@mXqbjXm z>w`HNeQM?Is&4xq@BB(K;wv5nI6EXas)XXAkUuf}5uSrZLYxRCQPefn-1^#OCd4aO zzF=dQ*CREEyWf@n6h7(uXLNgJIwGp#Xrsj6S<^bzQ7N0B0N{XlT;`=m9Olg<>KL}9 zlp>EKTx-h|%d1Ncqa=wnQEuE;sIO-f#%Bs?g4}&xS?$9MG?n$isHky0caj za8W+B^ERK#&h?(x)7LLpOqApV5F>sqB`sntV%SV>Q1;ax67qs+WcssfFeF3Xk=e4^ zjR2^(%K1oBq%0%Rf!y&WT;lu2Co(rHi|r1_uW)n{<7fGc-c=ft7Z0Q}r4W$o$@tQF#i?jDBwZ8h+=SC}3?anUp3mtRVv9l#H?-UD;HjTF zQ*>|}e=6gDrgI9p%c&4iMUkQa4zziS$bO&i#DI$Wu$7dz7-}XLk%!US^XUIFf2obO zFCTjVEtkvYSKWB;<0C;_B{HHs~ax_48^Cml*mjfBC5*7^HJZiLDir(3k&BerVIZF8zF;0q80eX8c zPN4tc+Dc5DqEAq$Y3B3R&XPZ=AQfFMXv#!RQnGecJONe0H;+!f^h5x0wS<+%;D}MpUbTNUBA}S2n&U59-_5HKr{L^jPsV8B^%NaH|tUr)mq=qCBv_- ziZ1xUp(ZzxUYTCF@C}To;u60?RIfTGS?#JnB8S8@j`TKPkAa)$My+6ziGaBcA@){d z91)%+v2_ba7gNecdj^8*I4#<11l!{XKl6s0zkXfJPxhP+@b+5ev{a>p*W-3*25c&} zmCf{g9mPWVQ$?Sp*4V|lT@~>RR)9iNdN^7KT@>*MU3&v^3e?=NTbG9!h6C|9zO097 zN{Qs6YwR-5$)~ z`b~qs`a1Dbx8P>%V=1XGjBptMf%P~sl1qbHVm1HYpY|-Z^Dar8^HqjIw}xaeRlsYa zJ_@Apy-??`gxPmb`m`0`z`#G7*_C}qiSZe~l2z65tE~IwMw$1|-u&t|z-8SxliH00 zlh1#kuqB56s+E&PWQ7Nz17?c}pN+A@-c^xLqh(j;mS|?>(Pf7(?qd z5q@jkc^nA&!K-}-1P=Ry0yyze0W!+h^iW}7jzC1{?|rEFFWbE^Yu7Y}t?jmP-D$f+ zmqFT7nTl0HL|4jwGm7w@a>9 zKD)V~+g~ysmei$OT5}%$&LK8?ib|8aY|>W3;P+0B;=oD=?1rg+PxKcP(d;OEzq1CKA&y#boc51P^ZJPPS)z5 zAZ)dd2$glGQXFj$`XBBJyl2y-aoBA8121JC9&~|_nY>nkmW>TLi%mWdn-^Jks-Jv| zSR*wij;A3Fcy8KsDjQ15?Z9oOj|Qw2;jgJiq>dxG(2I2RE- z$As!#zSFIskebqU2bnoM^N<4VWD2#>!;saPSsY8OaCCQqkCMdje$C?Sp%V}f2~tG5 z0whMYk6tcaABwu*x)ak@n4sMElGPX1_lmv@bgdI2jPdD|2-<~Jf`L`@>Lj7{<-uLQ zE3S_#3e10q-ra=vaDQ42QUY^@edh>tnTtpBiiDVUk5+Po@%RmuTntOlE29I4MeJI?;`7;{3e4Qst#i-RH6s;>e(Sc+ubF2_gwf5Qi%P!aa89fx6^{~A*&B4Q zKTF|Kx^NkiWx=RDhe<{PWXMQ;2)=SC=yZC&mh?T&CvFVz?5cW~ritRjG2?I0Av_cI z)=s!@MXpXbarYm>Kj0wOxl=eFMgSMc?62U#2gM^li@wKPK9^;;0_h7B>F>0>I3P`{ zr^ygPYp~WVm?Qbp6O3*O2)(`y)x>%ZXtztz zMAcwKDr=TCMY!S-MJ8|2MJCVNUBI0BkJV6?(!~W!_dC{TS=eh}t#X+2D>Kp&)ZN~q zvg!ogxUXu^y(P*;Q+y_rDoGeSCYxkaGPldDDx)k;ocJvvGO#1YKoQLHUf2h_pjm&1 zqh&!_KFH03FcJvSdfgUYMp=5EpigZ*8}7N_W%Ms^WSQ4hH`9>3061OEcxmf~TcYn5_oHtscWn zo5!ayj<_fZ)vHu3!A!7M;4y1QIr8YGy$P2qDD_4+T8^=^dB6uNsz|D>p~4pF3Nrb6 zcpRK*($<~JUqOya#M1=#IhOZ zG)W+rJS-x(6EoVz)P zsSo>JtnChdj9^);su%SkFG~_7JPM zEDz3gk2T7Y%x>1tWyia|op(ilEzvAujW?Xwlw>J6d7yEi8E zv30riR|a_MM%ZZX&n!qm0{2agq(s?x9E@=*tyT$nND+{Djpm7Rsy!+c$j+wqMwTOF zZL8BQ|I`<^bGW)5apO{lh(Asqen?_U`$_n0-Ob~Yd%^89oEe%9yGumQ_8Be+l2k+n zCxT%s?bMpv|AdWP7M1LQwLm|x+igA~;+iK-*+tClF&ueX_V}>=4gvZ01xpubQWXD_ zi?Un>&3=$fu)dgk-Z;0Ll}HK5_YM->l^Czrd0^cJ))(DwL2g3aZuza7ga9^|mT_70 z))}A}r1#-(9cxtn<9jGRwOB4hb9kK@YCgjfOM-90I$8@l=H^`K$cyhe2mTM|FY9vW znH~h)I<_aa#V1xmhk?Ng@$Jw-s%a!$BI4Us+Df+?J&gKAF-M`v}j`OWKP3>6`X`tEmhe#y*(Xm$_^Ybbs=%;L7h zp7q^C*qM}Krqsinq|WolR99>_!GL#Z71Hhz|IwQQv<>Ds09B?Je(lhI1(FInO8mc} zl$RyKCUmfku+Cd^8s0|t+e}5g7M{ZPJQH=UB3(~U&(w#Bz#@DTDHy>_UaS~AtN>4O zJ-I#U@R($fgupHebcpuEBX`SZ>kN!rW$#9>s{^3`86ZRQRtYTY)hiFm_9wU3c`SC8 z-5M%g)h}3Pt|wyj#F%}pGC@VL`9&>9P+_UbudCkS%y2w&*o})hBplrB*@Z?gel5q+ z%|*59(sR9GMk3xME}wd%&k?7~J)OL`rK#4d-haC7uaU8-L@?$K6(r<0e<;y83rK&` z3Q!1rD9WkcB8WBQ|WT|$u^lkr0UL4WH4EQTJyk@5gzHb18cOte4w zS`fLv8q;PvAZyY;*Go3Qw1~5#gP0D0ERla6M6#{; zr1l?bR}Nh+OC7)4bfAs(0ZD(axaw6j9v`^jh5>*Eo&$dAnt?c|Y*ckEORIiJXfGcM zEo`bmIq6rJm`XhkXR-^3d8^RTK2;nmVetHfUNugJG(4XLOu>HJA;0EWb~?&|0abr6 zxqVp@p=b3MN^|~?djPe!=eex(u!x>RYFAj|*T$cTi*Sd3Bme7Pri1tkK9N`KtRmXf zZYNBNtik97ct1R^vamQBfo9ZUR@k*LhIg8OR9d_{iv#t)LQV91^5}K5u{eyxwOFoU zHMVq$C>tfa@uNDW^_>EmO~WYQd(@!nKmAvSSIb&hPO|}g-3985t?|R&WZXvxS}Kt2i^eRe>WHb_;-K5cM4=@AN1>E&1c$k!w4O*oscx(f=<1K6l#8Exi)U(ZiZ zdr#YTP6?m1e1dOKysUjQ^>-MR={OuD00g6+(a^cvcmn#A_%Fh3Of%(qP5nvjS1=(> z|Ld8{u%(J}%2SY~+$4pjy{()5HN2MYUjg1X9umxOMFFPdM+IwOVEs4Z(olynvT%G) zt9|#VR}%O2@f6=+6uvbZv{3U)l;C{tuc zZ{K$rut=eS%3_~fQv^@$HV6#9)K9>|0qD$EV2$G^XUNBLM|5-ZmFF!KV)$4l^KVj@ zZ4fI}Knv*K%zPqK77}B-h_V{66VrmoZP2>@^euu8Rc}#qwRwt5uEBWcJJE5*5rT2t zA4Jpx`QQ~1Sh_n_a9x%Il!t1&B~J6p54zxAJx`REov${jeuL8h8x-z=?qwMAmPK5i z_*ES)BW(NZluu#Bmn1-NUKQip_X&_WzJy~J`WYxEJQ&Gu7DD< z&F9urE;}8S{x4{yB zaq~1Zrz%8)<`prSQv$eu5@1RY2WLu=waPTrn`WK%;G5(jt^FeM;gOdvXQjYhax~_> z{bS_`;t#$RYMu-;_Dd&o+LD<5Afg6v{NK?0d8dD5ohAN?QoocETBj?y{MB)jQ%UQ}#t3j&iL!qr@#6JEajR3@^k5wgLfI9S9dT2^f`2wd z%I#Q*@Ctk@w=(u)@QC}yBvUP&fFRR-uYKJ){Wp3&$s(o~W7OzgsUIPx0|ph2L1(r*_Pa@T@mcH^JxBjh09#fgo|W#gG7}|)k&uD1iZxb0 z@|Y)W79SKj9sS&EhmTD;uI#)FE6VwQ*YAr&foK$RI5H8_ripb$^=;U%gWbrrk4!5P zXDcyscEZoSH~n6VJu8$^6LE6)>+=o#Q-~*jmob^@191+Ot1w454e3)WMliLtY6~^w zW|n#R@~{5K#P+(w+XC%(+UcOrk|yzkEes=!qW%imu6>zjdb!B#`efaliKtN}_c!Jp zfyZa`n+Nx8;*AquvMT2;c8fnYszdDA*0(R`bsof1W<#O{v%O!1IO4WZe=>XBu_D%d zOwWDaEtX%@B>4V%f1+dKqcXT>m2!|&?}(GK8e&R=&w?V`*Vj)sCetWp9lr@@{xe6a zE)JL&;p}OnOO}Nw?vFyoccXT*z*?r}E8{uPtd;4<(hmX;d$rqJhEF}I+kD+m(ke;J z7Cm$W*CSdcD=RYEBhedg>tuT{PHqwCdDP*NkHv4rvQTXkzEn*Mb0oJz&+WfWIOS4@ zzpPJ|e%a-PIwOaOC7uQcHQ-q(SE(e@fj+7oC@34wzaBNaP;cw&gm{Z8yYX?V(lIv5 zKbg*zo1m5aGA4^lwJ|bAU=j3*d8S{vp!~fLFcK8s6%Ng55_qW_d*3R%e=34aDZPfD z&Le39j|ahp6E7B0*9OVdeMNrTErFatiE+=Z!XZ^tv0y%zZKXRTBuPyP&C{5(H?t)S zKV24_-TKpOmCPzU&by8R1Q5HY^@IDoeDA9MbgizgQ*F1Er~HVmvSU>vx}pZVQ&tr| zOtZl8vfY2#L<)gZ=ba&wG~EI*Vd?}lRMCf+!b5CDz$8~be-HKMo5omk$w7p4`Mym*IR8WiTz4^kKcUo^8Hkcsu14u z`Pkg`#-Y^A%CqJ0O@UF|caAulf68@(zhqp~YjzInh7qSN7Ov%Aj(Qz%{3zW|xubJ- ztNE_u_MO7Q_585r;xD?e=Er}@U1G@BKW5v$UM((eByhH2p!^g9W}99OD8VV@7d{#H zv)Eam+^K(5>-Ot~U!R$Um3prQmM)7DyK=iM%vy>BRX4#aH7*oCMmz07YB(EL!^%F7?CA#>zXqiYDhS;e?LYPTf(bte6B ztrfvDXYG*T;ExK-w?Knt{jNv)>KMk*sM^ngZ-WiUN;=0Ev^GIDMs=AyLg2V@3R z7ugNc45;4!RPxvzoT}3NCMeK$7j#q3r_xV(@t@OPRyoKBzHJ#IepkDsm$EJRxL)A* zf{_GQYttu^OXr$jHQn}zs$Eh|s|Z!r?Yi+bS-bi+PE*lH zo|6ztu6$r_?|B~S#m>imI!kQP9`6X426uHRri!wGcK;J;`%sFM(D#*Le~W*t2uH`Q z(HEO9-c_`mhA@4QhbW+tgtt9Pzx=_*3Kh~TB$SKmU4yx-Ay&)n%PZPKg#rD4H{%Ke zdMY@rf5EAFfqtrf?Vmk&N(_d-<=bvfOdPrYwY*;5%j@O6@O#Qj7LJTk-x3LN+dEKy+X z>~U8j3Ql`exr1jR>+S4nEy+4c2f{-Q!3_9)yY758tLGg7k^=nt<6h$YE$ltA+13S<}uOg#XHe6 zZHKdNsAnMQ_RIuB;mdoZ%RWpandzLR-BnjN2j@lkBbBd+?i ze*!5mC}!Qj(Q!rTu`KrRRqp22c=hF6<^v&iCDB`n7mHl;vdclcer%;{;=kA(PwdGG zdX#BWoC!leBC4);^J^tPkPbIe<)~nYb6R3u{HvC!NOQa?DC^Q`|_@ zcz;rk`a!4rSLAS>_=b@g?Yab4%=J3Cc7pRv8?_rHMl_aK*HSPU%0pG2Fyhef_biA!aW|-(( z*RIdG&Lmk(=(nk28Q1k1Oa$8Oa-phG%Mc6dT3>JIylcMMIc{&FsBYBD^n@#~>C?HG z*1&FpYVvXOU@~r2(BUa+KZv;tZ15#RewooEM0LFb>guQN;Z0EBFMFMZ=-m$a3;gVD z)2EBD4+*=6ZF?+)P`z@DOT;azK0Q4p4>NfwDR#Pd;no|{q_qB!zk1O8QojE;>zhPu z1Q=1z^0MYHo1*``H3ex|bW-Zy==5J4fE2;g6sq6YcXMYK5i|S^9(OSw#v!3^!EB<% zZF~J~CleS`V-peStyf*I%1^R88D;+8{{qN6-t!@gTARDg^w2`uSzFZbPQ!)q^oC}m zPo8VOQxq2BaIN`pAVFGu8!{p3}(+iZ`f4ck2ygVpEZMQW38nLpj3NQx+&sAkb8`}P3- zc>N*k6AG?r}bfO6_vccTuKX+*- z7W4Q#2``P0jIHYs)F>uG#AM#I6W2)!Nu2nD5{CRV_PmkDS2ditmbd#pggqEgAo%5oC?|CP zGa0CV)wA*ko!xC7pZYkqo{10CN_e00FX5SjWkI3?@XG}}bze!(&+k2$C-C`6temSk z_YyYpB^wh3woo`B zrMSTd4T?(X-jh`FeO76C(3xsOm9s2BP_b%ospg^!#*2*o9N;tf4(X9$qc_d(()yz5 zDk@1}u_Xd+86vy5RBs?LQCuYKCGPS;E4uFOi@V%1JTK&|eRf~lp$AV#;*#O}iRI2=i3rFL8{ zA^ptDZ0l6k-mq=hUJ0x$Y@J>UNfz~I5l63H(`~*v;qX`Z{zwsQQD-!wp0D&hyB8&Z z7$R07gIKGJ^%AvQ{4KM0edM39iFRx=P^6`!<1(s0t|JbB2tXs_B_IH9#ajH0C=-n+ z`nz`fKMBKLlf?2AC+|83M+0rqR%uhNGD;uKA6jOjp7YDe^4%0fRB<^bcjlS2KF~F; zu09wh1x0&4pG&76M;x8$u`b134t=dEPBn6PV|X29<#T4F1mxGF*HOgiWU8tN@cguI z_F@o+XL7FJztR63wC|j4x_DANzcX94r7Iz-O2x$({&qd*mdLG=-Rv)uZ}UlMR+F&q zU}=lkfb0p1>1Ho){o$@}mSKIV;h*$AND7~Dl)QzpFBlSM99Kx+F7GsVK5xcR? z_4Q(Z%cgk8ST}U;;=!LwyZVu^S$>B-Waeik%wzcKTIqeX=0FP(TGQ=nxi=dsS5BYF zl@?}NT!Y!Iyos^@v7XWXA{_bV~1lxz7gC?xuXxy0_?GaN!AhRRM5>)^t%&ODd;@HN5L{MD3 zc>i2keQZVm#?NrDwbfd}_<*5^U&w0zv~n-y8=GGN-!=_`FU^cM8oVCWRFxw?BM^YD zi=Vxz4q|jwPTg+?q7_XI)-S@gQkh>w0ZUB}a{^ z_i;`Y(~fvpI!vmW*A^|P7(6+@C4UeL2WATf{P1?H5rk`5{TL zcf!CgP6Mi{MvjZS)rfo7JLDZK7M7ANd$3`{j9baD*7{#Zu-33fOYUzjvtKzR2)_T1I1s7fe&z|=)QkX;=`zX8!Byw-veM#yr;|wjO^II>!B*B z0+w%;0(=*G3V@88t!}~zx)&do(uF=073Yeh*fEhZb3Vn>t!m(9p~Y_FdV3IgR)9eT z)~e9xpI%2deTWyHlXA(7srrfc_`7ACm!R>SoIgkuF8 z!wkOhrixFy9y@)GdxAntd!!7@=L_tFD2T5OdSUO)I%yj02le`qeQ=yKq$g^h)NG;# za(0J@#VBi^5YI|QI=rq{KlxwGabZJ0dKmfWDROkcM}lUN$@DV`K7fU?8CP2H23QPi zG?YF*=Vn=kTK*#Y_{AQN&oLju|0#E=fx%YVh>S{puu&K$b;BN*jIo@VYhqPiJPzzM>#kxoy0vW9i;ne2_BIG0zyRFp<3M(iY(%*M_>q0ulV2K}Tg zkG{EWKS{i%4DUuHi%DVKy%e+Q!~Uf`>>F6NgD{{I8~nO4!VgOvtFOc7(O)X`|7n*f zxBa4CJ-v9fUUH+`7sPVvpM_C*udZ@OTGTzx56QM5y~OlrZc&w9=)B?nmd@keRn+^= zvm~4sa5987LFDnU{(N|N zJAR8H@}p1fC+H(yTI4n#%~TbImMpuqYn9cQ<0QQ%=PzZItLkC*ef9WJUvfITKWh#D zc#__8`4am9%#NslIUw+<82#SR8AYG|woLfBg#!-&dqq}@P>|I0%lbdy0lSMmNe+}o zj0zZuFr6Wb?Y{Qy-S=|r`bdrDmhnmvkRnkdn`YCleU>Q$=je}LGhh>_QAj6aa_0Oc z%Swsmui;IRx7bN*=AAS@5yW&Y2hy;3&|HAiA8}!HT6!Z!RVn~MZg`RmI6&%#tBZDx zfD+y@Z~NWlk*4l13vmt3AK2wP!fQlnBbECL>?p)F?T)<`w&QN>cP_V>r7UTcsTaaP zTOb$f!P@zf$6>890NVKbIkG8rE?9!Y97sMSZjfF?A zYR8lp`LMoz~O?iaZN;gcX;LC-%Ia*R%A&SLx!YIf29?P+=XAAojK8!^OU*@?R&DK!#G_lsn!#;S375uZ&B0HH1|BO0R90$U>qs zSvHv>H~mAgNCcjo-e+;RjY6B9NCbQrZ|BHjTkehaU<9CSkdd>Vl*ifA2LNOP&R2Qdy3k3-TQ+ zbq=#vI43x`s=%~cGyN&y4Y!FxhwgDe@i6uv8^BLL&3z*SO=D0aLjih?gY4-9uWp5or)H+v~w6n5X#F-I52z=Z_p4JB(;M| zeaVFhuR2|3UD2MzVc~^nSoD2(dD#uL_1PdnIxeA{V5n`#3xf1Zx@4lw(DsQ&H$h zw#%3O<1173hjg2_nhKi!d1ej=h7y`hVjCNB6|HTnx>SWuCE-kgTnfT+YGX4_Lun({ zDv2`>d3vrS)tTf7ps_vvh!Cx^e1BFuWnEAh0(7fkNk|-3oU|iRWdsC6U)?Raft~HN z;^$U}vZK5O8|LV$>6X5T(uYkblv{zwPxnQBh(BQ5tA~J!vGiAMYP^_ki~pkIxDfOZ zUJDwq%O~WueeV6%uN<54&u*c&E4y431cklBNrb06zGOOy4XNT~JS-q(s6@)F@ovbe ze`fial(O4(-su%6@@1+V0MsdLLMyE8;)nou(7}czU(5ASaZYDT(kUZ0L(&g$nF^n9 z9-Pi`ZZLX&)^*M6As4_2Mmc9S7OT)F8KkL2NJ)KJcnCuWU=Wy402A&45#Q9Id~BBH z0cY*xlv!uXzKrXLH!xQu(OtJvEj|0-DmRj1vjFz{c*I4$Pe(+_V|^b~S!0xm{8lq= zZv)@NlcyL3Xdz+*|L137F7y6L-2VsrKw=q^S>F6i%<{Fr8zk06$Ay-(!L$fY@7mcng!2}L0t zgi|KxfB63Xtk_Q8#ZPipQ@!zgjdpEIbK_?q17Hoi4Eiyun$hrc>T(7pOLVLQE=lgGwA+A308p& z7@=09(|$>eLy5gLe{*|3b(M;1n;C^~v?o88jYib48eR4$QGsBFzd}3QuwO^_XE(=B zq+hMi0UFC|dB{LCwch7;zYT=NK})O%sgi0k#yV;My@24^B1+CuZmYOh0^b)5Ba_)) zC%i#_Iev&nsu%I|1N5=MVc#PrlunKAs&hY|3s5;@}`>sB>}gzxuB zB=2vrRyB3uiyW(hkDUNe1@&(b`;>ZvGgw|@s{zVC#_`HXIN_^J@Etb zA7A+F?ot37T{<-vTy8h&b3e+WKHE1oh;pUQrN4yRRrx?mT_9jRa2i4l1fUnLW^Cbl z!I1>VzyFe?VELWWhM?@?t-YPZkD-Qjo@bC2(o#ZtZmr{KZsdFWItV`rs$gp{724@C zL8K5}E0+DHcWcL^{BGei4>@J-3%a#$y6;I}=upc};-NDv-z#kPX26ylOpH)Ov1uU{ zkLj6oiH6l_s+B~_z;|Jc2oi?naS7#3H63~~lWj4rUnd=fCnKdkik<@R&kch9q##G{ z4u!%=rlM~Yp3jk*t8}1B`Sv6<%Z^}~1e@aq zg|JQ`QO2pSjAm-g*?IrNc$^~sIrNBo2$m|Sxanr?Mfs>2@Auu49 zGXlsS<9XS1&8h(dD*Hl&5HBDG!^pJ*lkau_Ur+7`7z;rcs$hT4we?3bT=7Fe<>{5( z2m2(c+hUz2BTHM8dCe*Z3XX&Av;b~a=$6EF>&^E8%nyxO@m_n!q&XD^A{SRjRZQ0L~qDeC=j&0$j6=LNIz@`ni^>ch|sv}^6 zlm>?28yPl@WmDPR?Y-A9X{U9Dv_IsbXJnzKCjkRksLOg#42uG2mE_acbTQ4)J|1V>%U@K(FP3AYhL0U zdeOCPN1qLv!|#c=p!_+%VNV(GHt`RuLRV^vz<5tt-r)yOK**kUWPspVAf|}ZL{LS= z@k(@@!P&W!>wwe`x{+GrFSWhHov7hu?{KuuT%kl#WO@*WX$i_@retlhQBj++SVNCx z5$78LxP>Z=^aJ)D280r_jj=zFfMJFXCIe^B{~V@d1rl_F(qo&AB4bC-vYL>x2jSKX zpuTG-6kgp3e^T&+dtV*i6a~)v@n?n*MffN59y}<0djUX zt27R+SE#hp8bzc#;rk$jw3r4)Q@eI$*`_)=Pvge8@8|8>H3X)<9YX6cXa=ii#Le;(qKm@%0-7$>2ShnYc`j#zJ7gu_FE^?uAkL|H)UIH#gPu^40!6^J=^ zr`}iwa^!4tzW~vOMZAaKF>*8A{^8m$i(VK)>?=#l`xrVe>wseSvM_aF zATNkY>kM_P3?1kE`uIq#mvr-wuTgUH0N<&JhF=(E9%^NS*HLm!4GZ4_XI zL=R5tlG5Mk_1rPfg)sk^llFuKPMPBhuU|L5q#yP_mzxp1o&pAzi-X31sgFpIHn@($ z_>=`AB5(8tP6p2zS5VEvH5J$M` z_much3>S7t3Yo`Yx!>83-hW9LYzDKP?mKdkD#QAK8*M((sx{eBQdrR<^3ZhFP81+& zBnJMUefQyNBji~$5d88Wfw1Lv59aJN9t2!pABLg;ewJ#LXL-10;QcJl+Y4Mtngb)k6JZlCf)3uD_u)J3sYyN;NN5hNbg$%W!i-GK%e&!Us)2IExWSss$YG(hm3kJ-h%yD z>8q^n$+4I(_y_mbT{du4P%h1j3oSpjhY97{+IZ`aA4ug!vNJ6*p?<2H(2w+GD3j$I z1TUXGyNzdf>_yB3grP~FZUs<2Quw;eEi*7s(-MiIkQ%@J^+WGdQvYSUN+TRiD-xto zJ=OUU+kxGYc!HCLNbCvR4lGTp~#L;DFzGd-#gJe*xf(P3hDQz|y)?b9mwU3WUVnpcqXM<@w%r-k*Wr^gzAv)8T^sqA=Ye z!7qy&exJmAcAt~CwS#@yNmjr8*T*!A6w4~E*ibaLRs0CFo(;R3=ODhDt6zWNodmo0 zXx&bT$6&+5c>a|WJ)F4G-^GjY0H#*tY=UNyYr_q5fsrcjk(c^~e*7Lf`!Jd`)p412 zn|^*hV= zFI4UbwA%X@smDd$cQOiMC%jfitTxTb+#`9`G=2rJDfK!E=5ra|So>lc{X1$~w28i+ z4p&cTGwZ#5VueiXS9O8#;RR$yg7tL9!^)Sz&pZYIzlSh}0}V{LxL$Cu%B4U5_}k}- zm~|CsD<076x@<>m=6w6N?WaThIBP`!u{-;WF)xc=2otx*lwf|5+MkdJePjh(B z9SH+%cHGCMAXNxB{_3^otDWdsV7Ob6n{0 z+&!(;iaHOX__5z_$Qk{%xYV%Ig@7iokGBwR`3642ZP#H#v9QGbWl8<|MS*=@qO@Uj z6+SZ_v9`1paUe5tFN~v(b#J3a_Lx0+;r9giZIx-A5TxdbG>xi#AZ5_z1V}B^n)sxT zz49}eK7EWb6wR!6-qQOrHQHkUvshvq%=G2d&@(#XM*Am1;WbnJ{X_!a{ZkphD$^TQ z=Iskb&}=lBm(RHiwJoGg`*NiQ6#RB$T#LF+>#ef;Jne&MxKPX!#r`&TVEFsp2jnNx>dClzpcPy&G&13a_<0qaR3i+k212~hoQ z8nMk{JP-t04I{GW5gUBqcJW-jSMrlw}>p)ptx?WKuCUV77taMiV zHok9V=6yv+Uts@fMY&A}amC=!Yj}eL@=e%XJ#%?agkt1jWF+10{(E9mHLDa>Ll7Vj zG=3cp%ljIB-6pC}6&`xJ*6WCP|IlglLWJ^?yviI8Ve)?V_i4%n;olzny62_`-|IGi z^=}p_O>Z8M;c4|RExu70E7ePW(HWVS&E$+LL6xSQgB`QfMQJ|4pCTFowA39p5P-|$ zUtM_H2HnP8_RoS~Vwk(FhbG zH41licj%=0a;Ln2STFBvU}Ne&O&%8bYKj!h1FA#sNM`232fX|U3QPp#3C?mN2;hE9 z;)!@5ixSPl<89^7gwhHc2YAX1KJK$#*3`KOMIQ253q7-*RJ5k)zp9GBO|Ga~X*^}US5oN@aG&waHV%vi~r{t^`ptTxb zL}q1W8S7*>7oWwvgV4uFLZ(@k`R*=LO_|Gu`prs~!WQXj-NLIa^2(7IHg>BG^N zc|i{-^=&Cek9dkJFQys|sjG9i>LLz|;yCv{^1i%c*h>8zF91kLvS9HBQi~ZU!JL`B zK8N+U0fr1*6??Ium)AF!6tc1eGhXIYL6IRT7rmKp7+>?%5Pa6zC5)KY$ycF0ZJ`G5nEQDG100U-jLkH8^UE4g6wq?sg%pP=-$&G#bcN`^?w3a6 z((s$6eRKcSEIslW-kk5Qi|5Mg-(xdLF}PxxVh$PuO}#aR6pW1kV4Af!Bqh*btXNNZ z>-4(IUl+L4dw+3LcpGut=qB45O+W)Q5?*zZ2A6rJcg`qkSvWA!j^r2mqKuCm6`Py? z@^T#Ux04HemPGd!Hs7NkZdVn1}8_j`o?)*OKZGS!`ff)gF zG?v-lj$wWNWCcw2Mg2o18D~1?3_b0XzdiKBNkYSDpcv@&kp0POmweJE2ZkIQ3B!a! zIgIoE+Xv?;34kyo^QYjZk+tEqZvq^#QG(OzX4~X+KtsoQoddTWUR(yo8R+ObEF1j<-syWOb>)JQ&Zbdu(sctU%Mt zW&YR0{ttY2TTXYZ?~WNU&cES1Z2q(7SrWDh``!J(JM+Nk$!hu&Y;(7E`ZNKTe0w+% zJc?Qnw2B+%UR}0;cB0Rufa(7-3FF}?629@LgTiEC&2uyL6NxexOp?AKT^aAx3gi(W zao>r>MPw0eQ3>IV02uLsC@>yK_epX6GRg4{NEL2wPPF9=*L2RV3yyK8DhuEK>rmmV z`&Q~#c`lgR&93TdOCja|ewOXmPNRh7!&dMT(1ett#iDr8HZW~VqWW@7fe9B6;7S+? zbC`d4@MEau&mKlOPKd>*10q0c{~^baw6!a*w^sY#0Xim{oOsiXiDOhbG&kl3c$$n1 zMRrD83&QucDSEcV*7LIp8VTA@F<%qe+_c`L;6on(>SjAU^}5c9!BCffT>$VQhe=)z z8(=Ej{5>jhmjB3{xDfj2R@VmHQ!CqjlO4KnuOmvHy3K#po$yp_V;p_MKjh1`(rzj6 zHW956k1yvntz{_g?Xbs`avK(IjlTnsu%htO;D7 z?J#x^EzuvVn&NA=!MEj7cwe5A-Z$Zk2LBZH$~%E* zf`((xH0?`}hs|HA%mtwfOEsZJxxrennkTYcwP#FKO5%Lpc^JXhSpV|ZH$Wr;`}`_( zIP==gd3LYyVtwD|*ZJGi{7~x8{=^bGVqu0RJ`n_BZH9+}kz%-4ZRsImi@rx%=ZEKs zcPnUXo6hbJV>fH;@1|bAHIe0ijYI*&kdT|HkDS$9No9 zCHo=*HWb~U+Dtzxr+Esao}6@|;Pf+E$ay0$kQp#s{wlw+7aIKbMdf`OqhoG*;Tco0 zjrP}VQG#Y2cJuqoJg&5({)S(BA}q9T1lGeWRyu=Je|)I!6a+aj!IP^1({)ZYe&x6w zt3a)Dq^TB+A7CdB0-}#z2Ur$W&h3YVw8==!xONy$uQmDWh-@15iEOt!q2m&?ZLA|w z8loSb(0}7y6Xu0?M5Uf4>VZGluB`wMf2oh;m)ghxVda>3m}4%V)r^0nVQ5V6f3>*) z0&VN!N0~GC^P}vj$`EDMZEmVV;N&RISY2C;$0;2(<{Lt&PKzqRByQdiEHGAbwtbS zPj`Da5%U6k1oEtVzI}QNw;!hT6F+~|@=c@$C4NtO@=xgP?|5MyZAyuCzcvq4rdAv@C06%gZ`9%I);R6UGiGJobfux+<0DLS&|MSG4UH z_~o{^^9>ixMg~mY!-@Fai{xaE4^;qy9iZN15Gbn5ZqHWf>Jc5Rv6(#n8`1NcCsdmG zab*dSXVPaE?)wCalD;$ivF%@nB#7D`@YG04p6ed9m}4iJW|pfVMLE<-c{=-8$e?cH zUdU#mCj4gb zZKA^b9p*9S(}8@tw~1RNPHr7tQr;P+-)D8|sq=*o)G%RGqt> zzP5yf`pVxb)I51D_G~Xp^GNK zVI6sAX)a9s)e{8N3?35YA6aQTXuyszK3ah~CemzA&CII#8F&F#KN41~8I^&_%}6MCNb{W87qAF`zj_Y^szhb> z3p3}KbOxotY|(lD=;)`fYE_*{S}x;f^SW#)SU&5X#o|-R|trpa|L5PS5aa0 zTHw8%SDSVtU4?vyrhnq+^@dgFS)|(y{~(4j%3UEiO-rBM9%`)8(dh33pMLiuurNY# z#10AsQ7%*0Cu_DSAU}P;X(JwA64~Q_^R%d_zSm^6Aux?Pn70PM>9EvLeOX z&w9c)pGmcL22;MO3C_B>=NC0RJpMp8?#ZUf=GWRvy z6RHq3B}=MGVg?9@iKFBpsvnkVh3{Vpp=`CcD=u~@ql{my|6?3ssi3mCOPnjI&E}VC zc@X+Yl>;;DNo0W0`0th!X{?luDhOC{E8N=?!w}K1{V=)+1={m(f`Oc|N=07>}3;z{-(A zm{JL=j?Sro5iecmE2-pWlRf(r%|HEQ7kgwQ9+kt=NBhtQI7OwcZ#3%$Uf%^r2nhjY zoQ08MfC%_X{O9~WcirMZMhn#z^ux4Erx-tf-6bHD)9eH&^L>^jvAd^9A^DCDs?0;k zkm7LE*KjP6`2d17MrQaaLqd_Rka}J$csvUec#hw78<=s(hyR>065~YCVCA9+#Q+; za(*L0IEw!r5P|@-;x33L$Lv9 zcuN8YG&g{<(SeJG18~(b!5yywSqQiLAX0;---;}mF5&b4lg|T?LwKREa{9YX_-zL@ZE?Zqi@HxK^2KO1>0LATu{te=T zprmHtY)bDVfxI1S}KBE7V zznP7KQ8HekWU#W6mw`dr-boV}pMQR==&5=Q5T=_q091jfc;R*jX#&=MQ%~@E@9^?`$v48ks<>(fI(F6L(5ppKy|$HWng*bKOb(4|cMUB&z$#ob#XV z5-mg)gmFIybZf=znm3ZPyUO^GJfxt0kmHjaTZ|sthsxXw&}Y)fOUSg=JhRSR^UjZ- zhqqb}Wsyw4zdnj6@#BAJa#-PdI4_dgafFXh85DsEQ_cT+5)XpZq$fZlBA_9UsE9r6 zEFec5?uqN@QhJ^IzwZrwl-5J`CmVPv{(YDTqEqWR^dI;5hXc~cxP%B3v&~s0`Ct89 z@S`i~a^c%V^N81dDT*ItFS*&IN;@O$EgzX0e7x&}TD=!zS}hTpezBLS>mdX(5< z)8DEI(-o_D)c-UX@dA1MuJ*yc>Hf4|`*B2S_O>w*-tbUwtiu`;W(Ud{HTty@(&x(T(F&;M zJ=?H>6`B7nf-90e8V`WSVp|0oEKB-P2M{}4ZDawzvM&a!y>`Y#jCsD%T_l``@ah(I2nJs~Q|%uSKu@k!m~*8B*IoA{*TgtF<(5sHCGG;n@NE%~Xt(G$^&<87u;}Na zx-8cq0g`uA(&RBFo=-4Y1GUZ<``Zw{xL4jfHkZw~%~wvtGueszcXt)_QwH8g!; z%s&3kSa~R$dO$-%L-)c@_hi7&>{6L_M>OZFkUQu;{sL_bUMStNrt{{&O(Wn~*zPOk zB>dnfszb29NSTf2pqIs68k|p-UrSrxgLHqi?3N-UFa!LHy9n1)=s>`yS+J{MEzS@ zNlfGtpma7kG&LR3JE@wB%rFA*h~~KitlO=IP)ZjN6dQLM6qsry zHkB#cyNh#n`)}bCrN1My*;k)^@>e4gJ`LJK?2)Pwp?4Tl4)4FA0(tvY+#1jOUM)xw zlMz4x-f@g^+yKUN`?Vu)|AwujArnM~Pa@y*Q9S8eS(u{-S%(Z5=R~pRl5ZGDjdqH% zC8rW&{##wOpU_oTIG4WXMk4&%2t1;lWcW5&!yxmOT*!hBcKyTqEcNoO+R2;Q?Yj+W z1-Y4?59fijz4(MIDwGe4-baYf08UCs;r|YefD-Md2ST;=cxwpgW=tR76-dQVAhn^= zG9Wk5lQk%jIR@KNU!UMp6@BfU;r+;y4VQ)D2!Il9HX%yW-9nOzV+m$YKzVaO`B8S7t z$!S2Mz`xw>V(RjE`0>bQp<0y&h~Y=M#jpy!#=dE>`=e_AjSZq6u!Dy1xJf~-7|0F! zPR9|n`e_7D2DIV2H(CESQ}hA>U>n|6`%z?YKEA~)BOVY%y=jPV zT=44R!L?J)736X#csn|lfBJ)o8ixaZclguWgrGO<`TN2FMfO}7;5}d+BlK0yTSH3* z4!=;5rOh85&2|x=46hkNaz?)U8&=bcfh=N_#8BNpZ2v$aVBo;sk^*X`v;4-LU;D>! zM*h12MxXIQy)SfAqE4;jY)wgnppazZkdNNVVF;(PLf^qK$FgY9+VFyBKE7UC|f z`R|?&egV11K3s$rJ6!GvoeW=jV*!-e(wA;x(2=d0E_e_%0x--0o8#~m^H1%AH5Z^B zn!TNPn927*bvaf0pt}zhK0o^V@WlGwwKo(*nQ|Q~4_;>~-8y20`HP>@UJa)3nEnGG z5Hwhs|FcmFG16ZVNb5hL`2Gc1{zWIMM{_OiKewV!hCi}U!VuE?s9wU-QbZ!)+Y^tS zGzp5OSi5iq6hmEr$w}&9DFgoB+i*`q`8TBi^MVS{SKEb8Aw%@K7@XCo(De2A`6%mf&a2#~y1N)+kJLD$1HCP!22)(U}xo2|j?WRzt(11j8Z_*v;P$R+Ug*Gy3VxV4K; zGGUGabnW*`Z}~`ydXL-l9e=GC$pY#z|63vy>E*m=$=j}iWP{sRTh0%H54`t>2xYH% zsk+M&u&pNgMCM@3e)Xc?jBWX-TIR_cQ1Z!RW7!B zBjZX=+^3}?SE)B+$EP+0oi1Fp5blDT?*}nsP>filqXH{ms zxU<$hetC`u)Wi+x|EKL-`y^#aQX+sDYIa{M;V%LqLrOk~lR>u0Q!+pyQSU4zY`?E^ z|5@)C)w6G_=i5YYC5SE_u(7hDNYr}uKT|@DSqF%S++lTIbIk^$a>{~0IH8KNFEy%+ zW#$&!ynpgNJh>6uR~?2c)ZMW+h0OKu231(7L_vETPaR+(P)Zy%0~yGm>E9?@@x!Jy z3PYgS}Q@b}x}E#F27@F+j}0=&Ql4gES&f8acMrPAVlVs9$97`FR))R5wI zc&}KFI1UIewh>3PkhnB7u zS3AT8_*|nexznG|Z*DU0c!K@jsI4J)5#DyNi#|e#`l1Vv1`1)*NVcy0LZ``aL0n8B zecupJ(rhq3u8bW0NIRhKYq$v1li+jp*4hfAd&wxYDE8vn1TQ7S@bTM|I2Ob z8vMOIxA7&_j{AKmD+O@EyXT`|dElt0pED^@IV0m)RPBUs*5jW60>>w1!@_G3aBKzG z_f(KfAPBk}-jQtR*Sroq!*3rbQ_m27e+YdzQjUb<_*k8vc_C)y!@cj5E>NxUhPu&g z@Z2<~esU`)ih+4opWe+K7sbN9n*9@n>#@n3*o z?xoROgDuvhq>jJ;Ve{6i<3roQNfgo5^4Q4(|GNExO2Dr7GjgA2zWuKp_K)K0R(6lv z!l$!zW-+T6mb3gQaAFviTQi{|*t%>{(mhTdy+y;Re4qT@kccy#{b z&zWy~kLO@>*WPj2k#H)|7L&gAJ37DmHQAme#@m;(Y8Nu^`D5vf8sZFW#+lA2!HK=( zJ)#hO6JD*`o~&c*&46d}g=Qj@SsoB5ikC z^1V8E+&<-OzuS_C`p5<<(A6fB`LXT(!kV^0_~hL6PpW4={l%|#xgdh?5EIk~lu8{D z2hiyhv3Yxij_#$Wu>P@7SYsl`-~3;}Ktx{34_NL^Kwin&=?!HDv3elQDbcU*qyYpN z(#yw~f1vFGK-t%CC-qa-4FYHbA^h>bag-I&*qaxwn?Qv|idE$<>1H|Gr6JtUu(he2$eg!N z@HTF@dG1)*y;4fxe)4_ZkpaBHH9hXp9p4|gLrRQyuevRd@gSS}JhRnWqrvm|U@>qM z=yl7RQROTKwQtzP3!zUF)_6Ld#NGA6v~2{J9Dd`h6{%+XsU#qGLh%`fB1Hc?wfayK zN`H4BpDp)npVQuu$DVW1qsBS&AJ2eP%6Qw>;k{)Z$8%HL=Q4(a$Ng2_vHw&vA!1L+9zc8vaX2GtqJ{L-;gvF0IR$em zMQ8@{Qp3+3Quk)TJ$?I<8KmwzD*7#(q<@Mc`dchngW}cRG14(Z6K7{T|LhFXwhqUQ;BET;cYqPcAcMgt6M$V9$(?jHo@Sud$an$U&5F zZ1QNh^ztt)E*d#Ij;<43oSKKnd+WNr$_r}+s_O_x6DZSB10*5Q{ourqq>mTl| zx4y^(cy+9;t@R=*j>3_dmm_m)$k$#937V(sllby&5)Xex^UD-|m|q<(jEd#@DV(of zAd7sSdmS*zUDqJ9|K%O2J2OfdUiK{{b{PCy)pi<;hp~7v1CQj&4-10 zgO<3dqhYH1#-Fa}Q{pjql5>>P6gZH21zLfxZ4$SK4T@7b!|`nWF9b*84Bq8&Eht;9 z*P72x&NUCZ7*@B$`FtE=hz5b}S`|c6Ey+j@D1ZibjJaRlR;{cxAWv z?Nqa>QqV*H-*zzaPvpLMHt~nl(x6?vrPpR?zn7~wow?oj*1TKmx4j71>$hvtC$DLD zUrz0^tiP0792U&dxJxNv@r}Elsjn^aSLUu=9#mD{&9n8|ayIL$!H3s>%KEvbchBFW z%cd?VU83mGF#Dar9*s~w&AnmQRQIOvR+uWsuZ?+|a=TzApXO@q^(r%8=}iv#wCnFq z=K9}JbqU@k99Q%j-}NNk+qLCP)jXfmOO|)@?mHcnynd6({mJisP1_}u7k)|eYHXWK z63eQ)E$ufFi!3CWUY2gw%e>omCv}qEX66aH-k&35f9`Q@Us|NPetVqe8=dX*VxJdn ze`q7b=Dn(UA(2sf&g)cOmQFhNJ#<-aMELJZbA#@to>25@kbW<)&!X01 z%NMJt>1ST)tyX)h@?`DxhbgCHr>S4wv}WC&Nw-!{+Z7$2D}74QAcXTvip=M0%Tp_N zor=k`)t|ra^ySr-+(|R9mB(E=`MX#y(wSw)$!iymzB;^c*>%&^*7HxTnRga=soSZT zdDl+9s;r!v8hk6POtzBaig4pRp7eWF(<8gufvNHPu6xs-=e{;mnHzJyGKE+8L0j}; z@%8-e^UCL5HhMiR>sD3Rve&yVZ#{Q1*CO8c+qSr^Z#CN;)(X5>tGG5yUw3<+CfhaL z%bP;hZ?jvgJU67BWyiy74_)6r)_nSxttxn0`0?HE^5(uydHVgP+HE$V?Lv)Leti43 zWA|;f-RqX``95>)^P-fw!Vi{3KNsII-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J w!5uhoe-Jcg1nPN%MiEAtgE$;km@@t6ukO)1^!cY^83Pb_y85}Sb4q9e0FIsP9{>OV literal 0 HcmV?d00001 diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Info.plist b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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:example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/.gitignore b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/Runner.rc b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/main.cpp b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/resource.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.cpp b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.h b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/.metadata b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/.metadata +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/.gitignore b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/main.cc b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.cc b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/.gitignore b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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:example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/.gitignore b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/main.cpp b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/resource.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/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/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/06-authenticating-users/projects/final/packages/component_library/example/.metadata b/06-authenticating-users/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/06-authenticating-users/projects/final/packages/component_library/example/.metadata +++ b/06-authenticating-users/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/06-authenticating-users/projects/final/packages/component_library/example/linux/.gitignore b/06-authenticating-users/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/06-authenticating-users/projects/final/packages/component_library/example/linux/CMakeLists.txt b/06-authenticating-users/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/06-authenticating-users/projects/final/packages/component_library/example/linux/main.cc b/06-authenticating-users/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.cc b/06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.h b/06-authenticating-users/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/.gitignore b/06-authenticating-users/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Info.plist b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart b/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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:example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/.gitignore b/06-authenticating-users/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/CMakeLists.txt b/06-authenticating-users/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/Runner.rc b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/main.cpp b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/resource.h b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.cpp b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.h b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/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/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.h b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/.metadata b/06-authenticating-users/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/06-authenticating-users/projects/starter/packages/component_library/example/.metadata +++ b/06-authenticating-users/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/06-authenticating-users/projects/starter/packages/component_library/example/linux/.gitignore b/06-authenticating-users/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/06-authenticating-users/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/06-authenticating-users/projects/starter/packages/component_library/example/linux/main.cc b/06-authenticating-users/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.cc b/06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.h b/06-authenticating-users/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/.gitignore b/06-authenticating-users/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/06-authenticating-users/projects/starter/packages/component_library/example/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? zgxkP+ytd)OMWe7QvTf8yj4;V=?m172!BEt@6*TPUT4m3)yir}esnIodFGatGnsSfJ z**;;yw=1VCb2J|A7cBz-F5QFOQh2JDQFLarE>;4ZMzQ$s^)fOscIVv2-o{?ct3~Zv zy{0zU>3`+-PluS|ADraI9n~=3#Tvfx{pDr^5i$^-h5tL*CV@AeQFLxv4Y<$xI{9y< zZ}li*WIQ+XS!IK;?IVD0)C?pNBA(DMxqozMy1L#j+ba1Cd+2w&{^d-OEWSSHmNH>9 z%1Ldo(}5*>a8rjQF&@%Ka`-M|HM+m<^E#bJtVg&YM}uMb7UVJ|OVQI-zt-*BqQ zG&mq`Bn7EY;;+b%Obs9i{gC^%>kUz`{Qnc=ps7ra_UxEP$!?f&|5fHnU(rr?7?)D z$3m9e{&;Zu6yfa1ixTr;80IP7KLgkKCbgv1%f_weZK6b7tY+AS%fyjf6dR(wQa9TD zYG9`#!N4DqpMim|{uViKVf0B+Vmsr7p)Y+;*T~-2HFr!IOedrpiXXz+BDppd5BTf3 ztsg4U?0wR?9@~`iV*nwGmtYFGnq`X< zf?G%=o!t50?gk^qN#J(~!sxi=_yeg?Vio04*w<2iBT+NYX>V#CFuQGLsX^u8dPIkP zPraQK?ro`rqA4t7yUbGYk;pw6Z})Bv=!l-a5^R5Ra^TjoXI?=Qdup)rtyhwo<(c9_ zF>6P%-6Aqxb8gf?wY1z!4*hagIch)&A4treifFk=E9v@kRXyMm?V*~^LEu%Y%0u(| z52VvVF?P^D<|fG)_au(!iqo~1<5eF$Sc5?)*$4P3MAlSircZ|F+9T66-$)0VUD6>e zl2zlSl_QQ?>ULUA~H?QbWazYeh61%B!!u;c(cs`;J|l z=7?q+vo^T#kzddr>C;VZ5h*;De8^F2y{iA#9|(|5@zYh4^FZ-3r)xej=GghMN3K2Y z=(xE`TM%V8UHc4`6Cdhz4%i0OY^%DSguLUXQ?Y3LP+5x3jyN)-UDVhEC}AI5wImt; zHY|*=UW}^bS3va-@L$-fJz2P2LbCl)XybkY)p%2MjPJd-FzkdyWW~NBC@NlPJkz{v z+6k6#nif`E>>KCGaP34oY*c#nBFm#G8a0^px1S6mm6Cs+d}E8{J;DX=NEHb|{fZm0 z@Ors@ebTgbf^Jg&DzVS|h&Or)56$+;%&sh0)`&6VkS@QxQ=#6WxF5g+FWSr7Lp9uF zV#rc`yLe?f*u6oZoi3WpOkKFf^>lHb2GC6t!)dyGaQbK7&BNZ7oyP)hUX1Y(LdW-I z6LI2$i%+g!zsjT(5l}5ROLb)8`9kkldbklcq6tfLSrAyh#s(C1U2Sz9`h3#T9eX#Hryi1AU^!uv*&6I~qdM_B7-@`~8#O^jN&t7+S zTKI6;T$1@`Kky-;;$rU1*TdY;cUyg$JXalGc&3-Rh zJ&7kx=}~4lEx*%NUJA??g8eIeavDIDC7hTvojgRIT$=MlpU}ff0BTTTvjsZ0=wR)8 z?{xmc((XLburb0!&SA&fc%%46KU0e&QkA%_?9ZrZU%9Wt{*5DCUbqIBR%T#Ksp?)3 z%qL(XlnM!>F!=q@jE>x_P?EU=J!{G!BQq3k#mvFR%lJO2EU2M8egD?0r!2s*lL2Y} zdrmy`XvEarM&qTUz4c@>Zn}39Xi2h?n#)r3C4wosel_RUiL8$t;FSuga{9}-%FuOU z!R9L$Q!njtyY!^070-)|#E8My)w*~4k#hi%Y77)c5zfs6o(0zaj~nla0Vt&7bUqfD zrZmH~A50GOvk73qiyfXX6R9x3Qh)K=>#g^^D65<$5wbZjtrtWxfG4w1f<2CzsKj@e zvdsQ$$f6N=-%GJk~N7G(+-29R)Cbz8SIn_u|(VYVSAnlWZhPp8z6qm5=hvS$Y zULkbE?8HQ}vkwD!V*wW7BDBOGc|75qLVkyIWo~3<#nAT6?H_YSsvS+%l_X$}aUj7o z>A9&3f2i-`__#MiM#|ORNbK!HZ|N&jKNL<-pFkqAwuMJi=(jlv5zAN6EW`ex#;d^Z z<;gldpFcVD&mpfJ1d7><79BnCn~z8U*4qo0-{i@1$CCaw+<$T{29l1S2A|8n9ccx0!1Pyf;)aGWQ15lwEEyU35_Y zQS8y~9j9ZiByE-#BV7eknm>ba75<_d1^*% zB_xp#q`bpV1f9o6C(vbhN((A-K+f#~3EJtjWVhRm+g$1$f2scX!eZkfa%EIZd2ZVG z6sbBo@~`iwZQC4rH9w84rlHjd!|fHc9~12Il&?-FldyN50A`jzt~?_4`OWmc$qkgI zD_@7^L@cwg4WdL(sWrBYmkH;OjZGE^0*^iWZM3HBfYNw(hxh5>k@MH>AerLNqUg*Og9LiYmTgPw zX9IiqU)s?_obULF(#f~YeK#6P>;21x+cJ$KTL}|$xeG?i`zO;dAk0{Uj6GhT-p-=f zP2NJUcRJ{fZy=bbsN1Jk3q}(!&|Fkt_~GYdcBd7^JIt)Q!!7L8`3@so@|GM9b(D$+ zlD&69JhPnT>;xlr(W#x`JJvf*DPX(4^OQ%1{t@)Lkw5nc5zLVmRt|s+v zn(25v*1Z(c8RP@=3l_c6j{{=M$=*aO^ zPMUbbEKO7m2Q$4Xn>GIdwm#P_P4`or_w0+J+joK&qIP#uEiCo&RdOaP_7Z;PvfMh@ zsXUTn>ppdoEINmmq5T1BO&57*?QNLolW-8iz-jv7VAIgoV&o<<-vbD)--SD%FFOLd z>T$u+V>)4Dl6?A24xd1vgm}MovrQjf-@YH7cIk6tP^eq-xYFymnoSxcw}{lsbCP1g zE_sX|c_nq(+INR3iq+Oj^TwkjhbdOo}FmpPS2*#NGxNgl98|H0M*lu)Cu0TrA|*t=i`KIqoUl(Q7jN zb6!H-rO*!&_>-t)vG5jG>WR6z#O9O&IvA-4ho9g;as~hSnt!oF5 z6w(4pxz|WpO?HO<>sC_OB4MW)l`-E9DZJ$!=ytzO}fWXwnP>`8yWm5tYw`b1KDdg zp@oD;g===H+sj+^v6DCpEu7R?fh7>@pz>f74V5&#PvBN+95?28`mIdGR@f*L@j2%% z%;Rz5R>l#1U zYCS_5_)zUjgq#0SdO#)xEfYJ)JrHLXfe8^GK3F*CA(Y)jsSPJ{j&Ae!SeWN%Ev727 zxdd3Y0n^OBOtBSKdglEBL)i5=NdKfqK=1n~6LX`ja;#Tr!II$AAH{Z#sp%`rwNGT5 zvHT%(LJB+kD{5N}7c_Rk6}@tikIeq%@MqxX%$P!(238YD(H<_d;xxo*oMiv^1io>g zt5z&6`}cjci90q2r0hutQXr!UA~|4e*u=k81D(Cp7n{4LVCa+u0%-8Uha+sqI#Om~ z!&)KN(#Zone^~&@Ja{|l?X64Dxk)q>tLRv{=0|t$`Kdaj z#{AJr>{_BtpS|XEgTVJ4WMvBRk-(mk@ZYGdY1VwI z81;z(MBGV|2j*Cj%dvl8?b2{{B#e0B7&7wfv+>g`R2^Ai5C_WUx|CnTrHm+RFGXrt zs<~zBtk@?Niu%|o6IEL+y60Q>zJlv``ePCa07C%*O~lj?74|}&A0!uA)3V7ST8b_- z6CBP1;x+S@xTzgOY2#s%@=bhZ@i@BwmS)neQG&=9KUtRf^K=MvjC5JnqLqykCE_P0 zjf#V4SdH2#%2EuDb!>FLHK7j;nd6VLW|$3gJuegpEl3DZ`BpJU$<}}A(rW?<6OB@9 zKP9G3An?T5BztrLdlximA;{>Tr7GAeSU=^<*y;%RHj+7;v+tonyh(8d;Izn}2{oz& zW)fsZ9gHYpI?B|uekS3zHUue3mI zb7?0+&Zm>Kq(F>~%VYEn)0b32I3~O^?Wx-HI|Zu?1-OA2yfyJ;gWygLOeU;)vRm3u z5J4vDIQYztnEm=QauX2(WJO{yzI0HUFl+oO&isMf!Yh2pu@p}65)|0EdWRbg(@J6qo5_Els>#|_2a1p0&y&UP z8x#Z69q=d663NPPi>DHx3|QhJl5Ka$Cfqbvl*oRLYYXiH>g8*vriy!0XgmT~&jh3l z+!|~l=oCj<*PD>1EY*#+^a{rVk3T(66rJ^DxGt|~XTNnJf$vix1v1qdYu+d@Jn~bh z!7`a`y+IEcS#O*fSzA;I`e_T~XYzpW7alC%&?1nr);tSkNwO&J`JnX+7X1Q8fRh_d zx%)Xh_YjI3hwTCmGUeq_Z@H#ovkk_b(`osa$`aNmt`9A#t&<^jvuf z1E1DrW(%7PpAOQGwURz@luEW9-)L!`Jy*aC*4mcD?Si~mb=3Kn#M#1il9%`C0wkZ` zbpJ-qEPaOE5Y5iv_z%Wr{y4jh#U+o^KtP{pPCq-Qf&!=Uu)cEE(Iu9`uT#oHwHj+w z_R=kr7vmr~{^5sxXkj|WzNhAlXkW^oB4V)BZ{({~4ylOcM#O>DR)ZhD;RWwmf|(}y zDn)>%iwCE=*82>zP0db>I4jN#uxcYWod+<;#RtdMGPDpQW;riE;3cu``1toL|FaWa zK)MVA%ogXt3q55(Q&q+sjOG`?h=UJE9P;8i#gI*#f}@JbV(DuGEkee;La*9{p&Z?;~lE!&-kUFCtoDHY*MS zzj+S$L9+aTs(F^4ufZe6>SBg;m@>0&+kEZMFmD*~p~sx?rx=!>Ge;KYw<33y#*&77 zFZI`YE(Iz?+tH;Fq;y=MaSqT{Ayh*HFv0(z{_?Q+7@nE%p?S8%X6c!+y;!0NLXwJV8Co_}R3*7>n+oMsQpv8}8ZS-P@(Rg|gmxZHzf=nMOUAAY}AZGfWVzZjE@4$=7xkIrs8BE%606aVU%kxz_04ipig51k& z(>c9rJL2q%xvU%Zj#GR9C9)HLCR;#zQBB@x;e_9$ayn(JmSg_*0G?+wOF?&iu@}S{ zt$;TPf*Lj$3=d<}Q3o!Hq@3~lFxoiCyeEt}o3fihIn{x2s1)e2@3##&GYDq~YO|!q zUs0P-zy)+ohl-VQ`bhvUpC{-d$lkpML_M%Kl6@#_@A}w{jWCDsPa#cSbWA#C4Sf|*C*&Z{ zz?hOU7Cc`?>H$WGqITA2P~fYudnQHxB8^;0ZFKC;19F#~n_2P@{cE{Czq-#K5L_8| zc3aOEwq4%zL5>YU_mc9fc-p~{fBTWUkxTiZvxt9FOqC{s#TBp(#dWc+{Ee{dZ#B!g zHnaOJ8;KO1G;QU2ciodE+#Z$Wuz*Hc6NRO!AUMi|gov=>=cwcZeL&`>Jfn!35hV1J z;B2@0!bIR853w%T*m6)gQ?DPnQ)o6EtKaN3L;o?*q<83d&lG&U=A|6hcT?f0)4h6{ zGIZ0|!}-?*n{zr}-}cC}qWxEN%g60+{my)o^57{QEn(tSrmD7o)|r0+HVpQPopFu; z0<S}pW8W2vXzSxEqGD+qePj^x?R$e2LO&*ewsLo{+_Z)Wl|Z1K47j zsKoNRlX)h2z^ls_>IZ0!2X5t&irUs%RAO$Dr>0o$-D+$!Kb9puSgpoWza1jnX6(eG zTg-U z6|kf1atI!_>#@|=d01Ro@Rg)BD?mY3XBsG7U9%lmq>4;Gf&2k3_oyEOdEN&X6Hl5K zCz^hyt67G;IE&@w1n~%ji_{sob_ssP#Ke|qd!Xx?J&+|2K=^`WfwZ-zt|sklFouxC zXZeDgluD2a?Zd3e{MtE$gQfAY9eO@KLX;@8N`(?1-m`?AWp!a8bA%UN>QTntIcJX zvbY+C-GD&F?>E?jo$xhyKa@ps9$Dnwq>&)GB=W~2V3m)k;GNR$JoPRk%#f3#hgVdZ zhW3?cSQ*((Fog26jiEeNvum-6ID-fbfJ?q1ZU#)dgnJ^FCm`+sdP?g;d4VD$3XKx{ zs|Y4ePJp|93fpu)RL+#lIN9Ormd;<_5|oN!k5CENnpO>{60X;DN>vgHCX$QZYtgrj z*1{bEA1LKi8#U%oa!4W-4G+458~`5O4S1&tuyv>%H9DjLip7cC~RRS@HvdJ<|c z$TxEL=)r)XTfTgVxaG!gtZhLL`$#=gz1X=j|I@n~eHDUCW39r=o_ml@B z0cDx$5;3OA2l)&41kiKY^z7sO_U%1=)Ka4gV(P#(<^ z_zhThw=}tRG|2|1m4EP|p{Swfq#eNzDdi&QcVWwP+7920UQB*DpO0(tZHvLVMIGJl zdZ5;2J%a!N1lzxFwAkq05DPUg2*6SxcLRsSNI6dLiK0&JRuYAqwL}Z!YVJ$?mdnDF z82)J_t=jbY&le6Hq$Qs}@AOZGpB1}$Ah#i;&SzD1QQNwi6&1ddUf7UG0*@kX?E zDCbHypPZ9+H~KnDwBeOXZ-W-Y80wpoGB*A) z_;26Z`#s0tKrf~QBi2rl2=>;CS1w)rcD3-sB!8NI*1iQo59PJ>OLnqeV4iK7`RBi^ zFW{*6;nlD&cSunmU3v4JKj|K4xeN(q>H%;SsY8yDdw5BJ75q8>Ov)&D5OPZ`XiRHl z;)mAA0Woy6f!xCK(9H2rq?qzp83liZAIpBPl-dQ&$2=&H?Im~%g;vnIw1I+8q|kr! z36&^9}CMmR(U2rf|j12oG=vb%Ypsq8u9Kq}U*ANX*)9uK}fAi8;V_7Z;0_4*iydDxN-? zv?qJ=T*{MzL~-xUv{_Kh_q9#F{8gPV!yPUUS8pEq*=}2-#1d=sC_|U-rX~F0 zBLawgCWy#?#ax{~DAnDvh^`}wyUO`ioMK~jgh%L7^}#h?beSyvQ_g>+`2`}`-1h7# zg*?qJdm=53hwN8~B=^|LPmYtOVrQ(W{sNm4uofq=4P@dUA%$onWbw_m-KWia&n9iv zi)!9#OJ#^}eg8tE{wSb9(c0D^PS1 z9EBS5*ypSiVRS_G0v?$hyoZOS7hFWlp4qbYkf9Y&{%OzhsIdHskLptn96@k6@^K@U zszd8POehITDK+AyW#JKpnWY;ju#MC$JjB1Y*~(E6N%{p#kO+bVxG3X<34n3fW=k{A zCZt|KP%x^GQ9%mU)KE0{LA=vaZvRQbxSlK~eAkwWo2Z<{j5eS5NVTMe`m%re8%~7K zZLtU&b~YDN%~uA9wPf>x2=PI=MA6_oVe>Ek$s5&&Z=8vvF5EODP4Av(b|dlNgF1O8 zy83W0WRdzjz2iNA~t1piEqlyU&`$yZtqR`6X_PmuP>W+D|8iH;FQ zN{JuU#Tz9mV=4R_IewROL1|mK^`lLat#LcIBfggzM(iO$pQT*-c_ z94^LUWw#5B9~sp2W1p`c)Y(xfR<{O^9n4E6vDDw{#-R4UMBKo{>Hqlqn*a9rl_>+0 zS5MwJC~nCC`1X%VCyWFsiDX;bfAJQAUkU#105f_s5U-8rqO}n8fA1{b>Fr6Q|Ea(V z5B11Lo^ooWF?`^{-U#?iatokWI-e$632frzY?Yzzx(xJc@LFM4A~-eg!u|tl{)8Nx ztZLXsSC*68g%9TFu(f&J9nmc^9hgyy#uUOMJFCaifSaDcyQ&6=8e9=t zIFEAQ{EK{|73{($!a4=!wj4ABcQrUQp#+gGM?wEUp(w@+Fzi{!lt}|3`PM%&d-seeR zB$}BrFGD3R10CE>Hsb>;PrP}pd` zaY4}6+Wu(`#uAV+E5SV7VIT7ES#b(U0%%DgN1}USJH>)mm;CHPv>}B18&0F~Kj@1= z&^Jyo+z-E)GRT4U*7$8wJO1OibWg0Jw>C$%Ge|=YwV@Y1(4fR>cV#6aGtRoF@I`*w_V4;)V231NzNqb6g@jdpjmjv*<2j02yU$F8ZS$fTvCC`%|Yn#x< zXUnP&b!GLpOY-TY3d?<-Hhxom_LM9`JC9LEX2{t1P-Nj%nG+0Vq)vQwvO^}coPH-> zAo8w#s>Je^Yy*#PlK=XDxpVS~pFe-j#jN-(As&LRewOf(kN-aKF(H+s*{*!0xrlZw zchJu@XAvQWX7DI1E8?F}Wc8m46eT+C<0eXVB+Z^(g=Kl@FG-cn@u$suj)1V2(KNg_ zh29ws6&6(q~+sOAoHY^o86A<#n*?Pg2)cK$+y;cY$hJLq4)4V84=j+3ShSr##Tk5kgmxB zkW+8A1GtceEx~^Ebhwm36U?oA)h)!mt=eg0QE$D1QsLNZ_T3NH?=B&0j~#298!6iv zhc0|-{46*3`Rx&nKSXnf1&w-Rs>#PGAGuY@cBTU-j|Fxbn3z49S#6KBaP^Lx*AOXxIibr z!1ysMi(&kr!1wwQB5w`BDH2~>T4bI`T1}A2RM0zd7ikC&kuBRsB`Z2@J!Udm{AmSN zrr0k6_qCZL**=)xRW`MFu(OY=OT;3G8eF~ z2mmkXZ9X(sjuKmq+_<=LSjphB$~R1o^Yb=rO!j!(4ErIox^x55o{pXSE9X$!76^*$ zoKhlAX6y%n^U=C~@!vIlEgXQGD@>oOU=_(aXF-Sjas*$AKESfRzxQ8#3yOj|y0OCU z>6Z-0%LCcjla&7I+CXm&caKp@@jQ!5M`(_{CL=@4#JJ}cHeZw>^b6fpv269LSV?gV5Q{kk?4;;y9RIsy5vk%DIRiL(9xe1aA@4!VX zDh2}xgUd5X?6nji%&7-%QuyKSYA-Z{PwJijUQ}In+EJl|x@dF1P<5bPa5W3&&?^h$ zZCo8LepKo0a(Fsln*cHL;D(gu9MMkoiM0*n31u)jHqX5x^F95tnI&^}^yKx3YwEm@ zo8?EZ710ykx@19{=yz5IXb8w4yjdveWb{IVL6Z(Cs>!a_0X^1E27o!4e&b43+J*u2Gb(59k2uK0goLwhO{ujLS ziI9LA9`&x~Y$6JNX!aEXR``}LUI}Gr#=<^wBHmg%v<)zRWDVtq)kT$-P7iU1R)2XZ zi~bYhV@EZ`@prgK(cs{>2jn$pxg$<|KjJ7%26Km>%KcXh^bU@y@V_Lf@=j1x%R4{v zOcQn{I}!2W<~08FOVnoV>zOTH=+>v9!jFo|q)ucqIe!N4{U5_G`>>*sVD{8I~4FqyU8imZ**-Gy`~Xd z4w35GMf%7^i65HdX{Iz|f2Kg193#KhPIeR)-=eYx3Z!%RM=JjwLrdk^B#6rg!ym2w zPbFqYyO4>W_Z6PonAwiu7?!h=x%sR-T+_*xZOGh2wWhWr%}%2^$$ zQvACIB~pi=m|`hXIMvoq`TOCx=J_D2>pi6$NPy3&8#vy|oX)=kM0Z}$BR$r0G}MzOk-OqG+VmZtOZoj6x4(tLh|5h) zBv64Y{DPHsy&_H(5_l(&Y}FhVvr9m_*_Q~Zy-}V9+VmGnvndEjYW4qt4K~N&Y&6g| zfpz*V=A#^mVmuOAz)(KVI<%v5NY0%Goy!{9&o41upsPWk(yFuRP|A4q6NMnX%V~MT zi_Rb-Bno2kI+j0Cw`@ydy{e%ARS#Z%b6I%_yfo_ZKXr4BLVoHzBKJ^ZG z-2>2IzU)55@9C|?_P$ew^-7zEiAKG1XAi{!3h%1m#9s%^pGy6S9wKFYY4<$djeoJP z{GI}Vd%idY$4_fh(7NXm7#;cC!DS&-{tGr!Qze{^%bUx2jgG@-kMta^q-EwrKB}d8 z{%FT>rFk_bzW<{lc%eYlrsiYTZXGgzD1&lmRyp+c1O=0=zAX=KV62bx-a~JP{cPF4 zU$-XT#(9&T>l@bMu3nSr{)%-5lV+0t&bxip4DVJ~vlL$J2P6X~ zd{FS8vm{Lhrieul*7&(AgPuXhjpGila%6_?-+k#b)cdk#M1jB*nE>G6NGOr+Ek{`= z9b%S1`$`=g0CC$>0$Db;l_szReLYVmce*(()9%Zz1`*fNXhI*oRlerWHarD(v^W^c zuc1Vuw6Gbp7ZsoRH>QGt#&lv;5G~Ovt$%7VFd*-rN2>UjbOWBFGNGO`bru7CFB4tn zL`^?69Lj_g_TA&`9`dSI8s|)K|QM0 zybvV7!>xDY|6c6y;Q}qs`){1+WQu_5Dgd8Qe|q}}bxjH+joQQtqs1IVZn6{e7T{ia zF|=^xa%eWO%(x<7j*QZbcU_;aVaVP!arexOLOtoSNt*hvsRL%}%)jPetSich(`b-^ zMZ$PM9%s@%*jPVz0Z^W*cK_>G4f}+eEVX`HOaHg#!B`<4v;x}zDLMR*M27`kNfp!! zOfdt(>k-g>7jf^{Se@3$8<+;R*cYtw+wD_Z8Pl~!JDCUEPq{Ea*!J9`%ihyNJZ30i zmfve}S5<$Uso}_?SuI$ks|{-ddGLu9WR9`^9)Kdi@Vs;x#SY-xp}wHPU0|vEA7234 z@BN1z7OF=OOQtPF$4twn3!HTVlUVD_)ubMM7PEPoiC6lQgL2q9PK4~e8v-OuH%lie z?NgBLkIdPMG$QBq(>r^AOHB`|*1#*!2Z? zuU8H|FD`OBRu^(R?Z-Vhr0j;FLpS~a34KREnd}B=EYHS*>Hm+f%tgJt!4J8Q`qn^4 z9F=tO#JRJ}tzA`vx$nZ)O%wC?Uiv0+_nz}5Lj4ki*&=K&*#U`=rv z`Q@Q{+IhAj@6lrNK2B=8Yln!O2%zomfRehFT~;!O@(@Xy|1Jlw*uOB-M$#6K^)QBm z_7%#QVUDPwnW{iOV-grMQQU|3{=BQMh}c5(yMGdoQf*)k9-B zMQ(^GdJh+y)>qJprknS!%WxqM>HlHOP#7UVdy>%PW$!l72J`n-p7j(DBKoGxXWh(Y z>BFDZl|7knU_jg_SSbvFk8)39%2)Hu5W0}HKlh>EaqvFoXI&56Yy)3) zQkE4X^P0QnPn?iUUVHJZXzPp`s5uv?pG{K9IgGoHvcmlBxubi|iF7n{)mhenIcxGs zgr0OpQy#Y#u=5lOyiECfE_Sn?Fj1LyoRKcbTgX{p<T*v!CGkPc)pcA2D=4Ekp0Gb*wpy7S88C%Ywsbr?MI(3UdsCM?XJ1X%*hNjB)XqZ*W(qDdtSb z<3XN74ARXL3=c^bfW~F%NM^5*Zx92>Wq`&M625p~j$8mYwLbk%Kf)jbn#<2z$%vP5 zy#b>-tF-S2_AB4;R^K&^-1LJrUmi@9rB^FLF)-k&YHK8P+k@RCJ1qSTZ@=kHxA3l$ zmK_ZG)l6(nmCR1a8|;QF-B5e_ELnjJ1$m-;4UXX?WytF_wz7#&AjwZYTMVieLbq@R z3t-q|G4^BB#EpNu4uyfDebB+-uu_$9>y-dzB30Y9F=R zrW-Heqnj*InPTWHgR9v^R7~hokldh&h8=HDhMW(EFfim1*{)5Lc1-+eBVkK-2!u=N zuZKABgJs3I--NbjE;>Undg6uK`^U>AQ6V zhc!RhYgvrmeGNsftr+(C<_MtuV$`5RZTf#5r=DR?gWG->#})#=(td%C3`oO+2B7im zUqY}&a_QNTn?s+?=mNXiREN%x_=(H)L|DtYPY>SR3pQfBOel7G_jR_{!9`dSj8Up-`JgcB;=Oor)U=_EVjF3C5{Sqh8cq=~bRjoBpoc$kJCgtTyZGSpQ4= zYi$6b$-dGmuTDF&@amhV?cU05g(AZV&v2$4m&j_~GZk;&keSO(@LRESRZ&p`dV*6w z2$em~p*8yM6j;SYorw`M5K2mluJq7P5Yn$VtZj8DEs2Zk=O@4T&Q}>~f31Z{uk}`E z{Dp{KObh1kk~~MfLUod72{Pk6G@T$_0_N??lOrdR=Z;VV#m0l)&@hz{Z?)@sgImi-&i1@95g53rON83v!yVPDHRU*Mzc4yZ(-Fr z{8{WXmIJf7jeswk$;6s~Qac6QyM3W&`}m#gRt=rr95A+Ad&wSAgvXZ|F))rBJVJ5W1CsjN`QaOzct2ocq#0!v zmj#075)C!3oS>&N;aHS@<+c>RHL)8j^p)k(8#7$LEx!1g_1^02!4_qA=;uhKW=+ix zGX%+vBMiRiF^^jm{mdO(?GdWJ#unO#_F^7mhT8)s(z_WlwFyJ#Xh)k5+RG2f;LC*K**1dr`#}~6A=0B=I&V;%zDA1)d@G!X#Rng)7G*2k8Kg447r0ox> z5NK`d(H-afBwo9feDOUi>;BbPsu!2|=@g=3j*PY}@YrOb+SX6?#Yb2xaaK!?>SX1J z_!VsB`2n1=wwSftkydm!39|-1?c%Epx?TO<(#GO~I&{f4+)XwRk<7RQ1~5>QcKH|D z?!}j1ueO0Lk;FZ{k4FA_(S`Ot0w~tl&m0duID*f6RY#bkw||o;kZ# zISYNTb|{~|X$m$Q-Jv#uxyw)eM0gIv`V#wOAp&Vv@>X4_tSZ&L#juM@$S9 zx_X_tLh<_^-F;LAQ09s@sPb%PMTrcw*HUV0P=RYSlM&AXEOI&&R&YCm_S<7DRBx^L zA^R^iwW+LMk(r*$Pq-fKU5X@=mQ=`ErO30H@@&qqnI7zJcrbSh+H<V ze&7Uli0xj@WrW#&-9%*FP~kPYF_YYM_hs5~|ExMynQ%qvq`leRB6W0yhC@pCb8>_P zlf=F~WMv_u*-DV=UaVu#2rlzK{q8D95VwZrfV?gj@rSNWXFvktUq)V5+YrlxwX302ae(;aG4e>L-M@3J+-f3IT{b9l!kg*2M zC1+ND9}6m^()LE87Mt+^Q|)!y#suc&v26C=0W88%a{?)E8Yvo@kM&KNMaOst#|-_CbUTm}WS@-c>nRb;&z^ zYr)+IE$1=jov(CZ%3uR+`~NI>1&Gs6W(jaamjcN$a`2!*nO}l|b%?)Q%%UWzw>A`C zR@px(P*7j$TK?jbv*%x)e^|jcLsv}aF(Z0=7(%Oa7+1wY>{B>d+i&ZA$}k(qgZPZY z;VkW~8eWnU&HPIAbco?&tc2O1$6=7n{u|^Y*nXoac{o1W-6aXfy~KlNbJfLoq~6;+ zDYmnv--Fhqrl+UV#k@_(1=gWNtqhyVKN=9CZ-{Ohi>e=~bm4IKbhM%%W zW8oXE!rGpV7Wt(_^4nndH1_imheaWzDi|I})9ZVZ9>pN+P%dVc5wG`Ze*4`@rjn1^ z`ln(;vPBHQUb}y8S>=8q__r7g+=z$>!pReVB0@XKchAvyGjLQs-u>+w%`frV4FeIG zj=7n~hGrwx*&5aHy(7X$bDZ7YhcP%(*>G^lAYMK;qG~V8Jz@b7oNg;IA1z$9@TbzW z;@I51@Ekef#qbxnG$Y8Z%bm~ibZ=4#%yKr%#b)CDrfKN`ujIY?tA4h9)i~dZ4E;ZM znvb$n2)zn$Wx&zlW%mJZDh28ox$@%`w3i7YFepXUChw}$UXKI=-TM51`M#FH=tdr*mQ!c=aB1296Lu>iTTKZWss0f z5~ihdImPN$aTle_AdbYC^31}_^EK|9R&l#%3hbx;8vJ+Gp^tm{9JDILu*1PW!rh^Dn9p<)h#Sl4kKM%nm<+!ESSk* zC;lLNT$fgr-!+{aBsSx$41b}yy6o>r3F#1&iv3cfY2N<+`0qJ+>=&Qxs}JOEkD?^l-F5i`t5+zNuvJf z3Fh4$mNqiFXL-aq4U4K@Ae$fq-TDT`rvrx;gqx96w^*@s=mcthCaIyPe(w)6kI{EqV10tcShHU9eeAPs)s?6#vrq}>y3FeTJu$Udha+z zs7}rmA@yR(L&>35sNjQqrw}o^)UitMU!5g6nnG)(tgst!^`FKJEzI1(d@j_w@;^hr zgYxlIRYjho4U$bhczfq&YySCqCE(5_d>l(4tk1v9!V7PB%Vx{QO=G2NC@c1%3rEzw zN<6i?h;CJX>h)kn49Sr)g#Em6km6ESP`1qc5C3ZHizN>r>V-fSS=X1nT{+Thh@kC! z(H=PlqDt7V6gOYezXUK-dretz!1?IUD6&eL2b!4=9h+HUO&DYZKMM>|YhlEEg?q?S z^XT4$2Fd|zT=x3U#L1|F;-#`to-Y6hiYkWdO=rRC)meY72pIfl`3zEGDU8($iWR^K zI$nq80aSJII<;#W5Pj>^_T&013BJ*O89Uoq z5>;Paa^E}xar^r=!pexg&OTM8wluk4R~Ru=)Hgk`Y#i_$jk{jc8hx}?(dW*X!l4vs z6_%$s#duJJFmaFc-5#>v6Yea=I~)s_pXGS>Tkz?s+WS}>Qp<9MappMLXpkXpSM~SmH6u)`Z5>o02kJs;w@KhdiZ3}29y*xr|6tMo zBHzGic+b+dTd!xOJ;p{Rguh^corJ;K?R6daayQKm+0rf7|AXg0qs!R9eS7t4{G=fs z1$=?kK1Ih=gEkI>@jgXDWHZt*C7FUEWs|u^pE3Z``^K|1KEC^sbN*4nQUfRc_AyE0 zn)?RrGjgPkzfE~_s!rDB!fDsV+*|kEX4+DyS#8%!cshn;s8svwBXSsDGX2ZRa0={* z=`p1F{zD17*Rk>Uk_cw3t5j=9-d6$}MoM~z{v{t^M!g75-+o8_XkP@CZWUQ2z!^26 zCNOu~hgrrK)y>bgqb{`Q_1^zrG4;cGarP!nb4E~(ZKWc`LVeEq;IewVneLp^ZU2+% z95PgN*M5v7Q;ZlGvM#`&u2NdHm%&gZ{bZM5wBCp&?HeZhwU87wyT_z!n4z+1?=RvXZ^72d*%+R1s1$KbAFtR|= zw;MEq=O7pMIKpFwKH6$OOszJAf<_Z<1)36cB>D>|Z6$gJL~jH`n3MMou$#Si%rDAu z4pSkJspG|^CJ86vg6kkfXsA_`8@8iOryOe!Qhn8SV6}mPlof3=WJRVqAr_b;e->`Z zMR(p|K|$L0^6;u~USxg#B6-ZNc%E1dv*^P=|2k*^NOBni#G%9Y?##{=)8KZwh85OL zSBG9|gb|hdmY^gn(ziY&O5#@I?W)W;361Yb^VQNpz0A7&^(7HRAsUvw#)fvhocvja zLxV65J0_$>&cVRctJFsn^qLos^tG`+B0_gQ{NeOwKt-!C^gGFufdtPT*Vi>l#X1|V z2XxsAcixN)Ekq=a##_^=k_^BFH5_zpvPDRP>u6+3$}i&b zy0@FdzAHw?i9OqnlTts_w5D@Nd#eM)KKEuN#m{|AJyscxa}(eA?z4&4yvXo{OBS65 z-?gW;<+;+ntM}U_yTmHm6*2zj0Imj<&ZgE9Wj|gfsXhrVH-c0p$7HXnR8bxDYOi z=_r3FA~u`L&2;Vir8}P3)k|@c?sK1U@&iWo{HEXcoy>6wQSuJ+b4l%aTBuigs&k@Y<2c=S3Ef?p zH>ki4yDuXdo_eu>X1{E$g(Q-u#zVXN^&%70guoizo7x(kQ0OZ}H$O9UB}(FaX8Ct1 zFpx~}EbHf2r6V;x=@8GH$C2|6*?K~?LrtMYd^bw*WYXhA z_))@RMH;nZedW3+qfWbv<|_#BYOxX^rhbN+!za)|!|8K*LRs(R$O*2SDM{g9k7e{u zN4VIdi}e#0&h?sBxu$>Yy%)j(k1V2fuhp8r!}gfF@b;F?U`6}YnnMh1&sSU&lR^?# zu!61+lGsuFEfDraX3+$QZibCbKzc{75G^T7@WZSQ)j5898G1AOXB*H*TSd`f<`IK# zm1%&t?i|2Z-a&r!pJehzg@!awNp)R)aa?q_SqGrxE5u+T#f?K2;GAHV?O&>!W@Q*k)7=g2vDW+7K zbyY9i{|nOF*SbMYoRQSAbSH2y$bE5(@d6xKxcF#@TE~X#3o=;`0sc!RupdRmQsML? z&>SCwS{FOpSr+@6Uuz3m`hj}(^g`Jz|6?({!%WVJn$H|ugxW+x-GEA?J&U^ugj3Nb z;65~)W<}iH2PJ@st8LtLfSOLXYgj=9<;?ih7rq$bXW9J#!B8!Wu6#U`A$wlcoC*&` z_9Js~7%m79#+edeT&P`@_Ng@e&5J+pqpx%31tAF71)pcz~-yJ>P5yX(nuM4;bUHDa8E(~~l{j~JeCGkX>nHJDpgSf&bTHEf)qw8{Q~CBPEVen|MW2P3vmf`8X9-g|>>ddp zcgfjbl~(?3Wa*NzQH>4nsM$3}Ul>pX1xC0oF3TZXe7=V!9!n?WgvH|R zpbruczmB%z=zkZ>=1R|gXwGThLELqD5KCUhtiRGT*JwKIvzbzV%ZU!e!VcNHSSX3> zObH|oohc8nvQZ2}q??C}@>!fe3gH+HF@4(qWqi>;ag~md#D;cl8&gQb^?2a@5cikT z=7r78@&5gV3Ggc9f=<<8v~yz`NcEGvbX1V_`IL(&+Z>LB zM~$ok2qXzod@1$TEl*U~H$V5g$er{Uj^($sWb7Nr{gsIbE(`$LRGECTOraXiU%=uq z0zvpi1S%)RxTjzoVcR4#10)fs()4Mtsa@e?9j)Bk!LsYyXIZga2q7d%`vQE!V@<1Y zmkpH3LeXJNO9f7l>F84g;huc=4nk(UnU}RLZmYk2TtB#lv34K(?8~gyx-mN%g=U44 zOPdr_!j-;IEbe|l9-buuKEy^Q9MLjSKG$S6dz)!U_32{1)N}L)3+COmlg=nY1@od$ zJ<0z-B%sisAR1yh>z-RfQQb6M4i-d#vxvb~f69M{JLPZv1JSCh1$gQ*LxOF-tH9!k zbQ0ZW)S7)qCSF|=2`q_A3}OHBNBueZwTTz^ar~gz#2KA74&&D)KHt~m4F_nK<^*7_ z!!pN@xiGkq%>1N(rNxw$zu-=1t*IpAy$ z4~dD0w%9;E?(greVWZ3(o9ux`elM>Rek#0 zO=#-(4p5B+wFzlEU7^k{3EdL6sIp|K*>xrriI`}E8ze|z-$YpN`^_teL_7P`%e>IN z7tNiH619P+0Q1hBR|W#POOta)1|LkIRtgz zMJ9VOxXN#o)mlXS=u%`Q>~PBuKEmOWsIuQRp{y%!ty{fEyL0gV)$LQeL#pqX3L@SR zJ2Gb^E9+KVd?;joVOXlGie3?z6>(>u(i!(qGz(W( ze~^xj&IRF<98ypEis{Y_FoHn%C0bW(XeF#Lj=2WUEBqKNPPFppEH?_a3}-h906X}C zSYKcZFU`Om5YlWhh@ogzCn3NvuM~F9jOX|xe-X*!YL+#ceh_tJoHXz`aTnvSrOAZ| zOtdGz?QdT!oAJr3(XL2G(p%2X4{xEohU&vd_zQ(U%ihHOlKPWnb$&YYhx48?|R++>`5?sxvM?!;ru|9 zZ#nwuTK^S%ce<+ggdJBE&fRrXN7O!{nu`%q`M{2Ef_+IRad2cf01P9pST9AOK>y75c!9}~)Et^6$`&Nm{wzWcm4c0j9DF!xJTpGrMp3esI4D_iiDe`sswXSu{dQZE_`^A11 z?Z@Hw=65mVu^%X`>;$mciK}XiZ{xw7I_!t)S00^JuxdCXhIRO~S*lPS(S^je`DH4E zxbKNs8RL`N?gCQ@YSOU=>0FE#Ku#DRO7JA&fu-X8b;3!^#{=7`WsDXUxfUsE(FKSQ z&=N`A7IwLq%+vt(F;z+T=uZNl=@K4|E%p{p^o5(BGjsE|WOR`%8+XgGW8xJTFJc4L zVY#L`OdnSM{HyS$fX1)3_JuNNH1aDsDqi>CzCT5=kY5zV<~29bX)c^I8R5n&ymHkx zj(QC4t#mDK;2xi8O%V;C{HqDQeM64=b4@sa*N_K0a&ro4+8LY6cFHz< ze|!g}zF|tDrP=`+U7KwKl20gdW1%!iN>1=uxA|NZJ2peruBOj?RBPb~8G;s6xIi6- z?_odhafsxoxiBf zwZZ)c*)FLc0#wE~bXw0TPBYl+h9hs|DYr_B4LR_YL@S1hQs=p zNEh%_fUvWZCbJtaF#kP5=(O#{8|g&Kmz1&8{@Lufw^DhtvKx955~aqxi2C=)Z-!Kd z+m-u+#^U4(HYn6a1w652kO0bYBt&goyx(n?MR^kI+{Q?0Y{G~W2) z0dS3fuJ?SU(6ZDp=kUley%PK}K_;YQyK|U|?7t9SHiyIfpT4a_kUVIhH4PSaj@3mo z`z}|mHhx1Pq?@(3vTBb5HTXuFAzFZEt0D-fw_kd=XvwIUh3VXTm{wbDA~cESd5cI1 zd>6=&AvG3yu+)`9oxmfrDQ(1fzv(_0l?bp{a364dXLRRBI8kBv!KsL;brY)#E3`o{ z3TlWUsS0{Voci?6MejccG9x_KiqN>So*1{25r6BSl9jUyR}1TgXBLL7Pr6Wv~Nu47;fbiU7TbL}>qmtl36YSZ() zVf@nqW(As~#`@bIC+AxSw!O5Pocf&rYaCFm?Jd?XR)p#@{!|5^Ws@wd855)mI^8y{ zws+VvGXW6%xoj@JkGb=~%oJ~7m6+uhOv?bH+jJJ~eFgp+}~*^C+3>R-MY!IZQoabCh( zN(T+z@Oyc^C)WqQESmh{d!!T8zS(!wX=R#hEKxMXy(eg zZ+Cwm1a%?;RH$h2_ws|nRjn8ZY!>3gn+6Ep4xT|AeFox7!rac2Lw?jsz}JqPE?5JG zok0}q1P;cuzs%Yrze|&d$oTr<`Lx{fbq2OV=!3v-ODq(n?|WxuhtmwJBIoW^^FB+D z-?Ok9HBKc5@)L(W&vmI{prL?4^OE9TR)bELS=<>*w%&aKjzi*@;5#P3moG@dm{Eke zhE#Is;&=o|{2GWai}7LYEI+gmc^Kj4K7w7n)+9godg?yB2?xs}pF1<*!Sv?D~Uvbkgs9xx9s#6zBv9l@ox>d#H6eqw^KZO;Vg}h!q zI33^$4}yF*q+q{DsJsa(SsV!YQ#zi^IF9MQV6i{SiN4dWWCi%YQ+hNc1r!^+<(YnB zG62-D`M3w3Q2;@X{S`n`{QO>migDpz0FK`->sYDOESs6u>-~<}_XN_6><2g7U#XC{ z$#Ig;n{_yEMnlvx-lP*;ts#DHV0r8j518>~33?Ak#jocW>uk>6V||p7{4rov#RS9c zdPD6r`qF1om9r!zS4Jk1>7fn#GCnmD=JIt1Na`X)=*LP7R!3XATgk`;&U*P<(0d z9p<0T&eYqQ9jot39FxpfuPSPYlfQ$s-*;+c1KL+cHIVcG5`H~^Ryu1Hk7%Nf$TCwR!SzG31@NHpm`mcp8v!wyWM49TjTxASJ-8JP*MTHLC}hF==PUOh8kaaXeGFGd<|e29vSDaS ztPeu&zv0^wN}Hahi`$pcDs~FVt2F;K!q}q*Y@{7i#stWfU`u2La4aerBKhV`^zG~j zJWvtZpcHIP7x*tfLSQcng6D(`HVp4=LWp_0Xt=2wEHjK)!DSz_Z?5J@>awRyk?azj zU-kdSs~cp))*pfJ_q7u`IsCq8F|OShB~D56S(Mwwlt?{yURE7#eI&WcpVq(@9Fd~g zeUiD!a4w51Nj(YzLnau+O3MDub|?loF0=<#jLztAM>PruE7yNDD0L}y=Ayuc?^?Ni zf~%GK=iEhn2}xKp7GonJx!JpDmDsco$|$XtRdUDwbM9$9s7x9-of2nKNj~?b@UOKz z9{`=Irz^ba-c&1vSQxSh;I2`cKc8-4)aCy%#bam;3_8vSJ-jw`_}lyukEC~z00EbC zI*dU3F21A)dSZr{qA5QF+{a%D`h#?8o%M?)*hWxuqnQD(TpcmfNq&UN$BmB)0!r8) zxno@Q?$_D&*4(rW6b+?-Y^5|*P`DHmJ%pI<6*yP)o}2^?>d7P#bd2j=vvx2mfLW@R zQLD`%buR*}nzNYNf%68w-D$7%v|=bXg1mYrdZy~}(@RRZ-U+Gx=nmCjVxr5Ag# zLw3R29-MHJl|`mRxj#sv@EfyR#-q>BE-XFEENbV$#dWM?!VjU8~kKZsd@G=HPrI{HiqN&j<92*-3$^M*;n@rG*i! zvi#?j;lc5w>@+r!6*CVUrN9as=S3?(ZBT979$5R#ZpPm?2VjIyQcEFp9orGR>f;G? zK<~FiYY6ow-&}|v7k?+03TC++so$)2~rN``u z>N%j$AbNQLX_!evzG8abf=15260vIXdz7K^a$YS)iw{@x5<|Rr#ii|ov=LJ{eu>dZYe_ip$ZuzvRu1dpjQK1BvP zH~m#t=2_wy>9+YkdNF-z` zQ*#7=^r%R*pIi2AI`>n9>(QJVE1k8?Ilav<)NUjW^O$}^yZZ{_Uwn!4Fq1`aslX;Y zj`XDIm`E1sz|wShA=?a@ZGKDSMU#Z3$E!1nZ)g^Eg3ZDoSN6@RXrGVCHvMIauS7d> zuJltXf9)LdTWdF!n%-iA9b#2$W#i??K)zYho^((ZqluvhAr@{H{diy0%@-~VW zKYC|2Ma)2^=skdLT@ZVqJfiCDqS@~qIGexL(BKy6Aw9ch0hoHN&E+m3*uka9+AIh3gTWdSe~W({-&^oFw`!j7$DcsF$7`pO?kRMK<9h=SV?cmyJIe`$4|zoI(6u9#qY9zM?#zNe^!Dl2>Z^dH`>`wSY# ztU;V*+g0R0DH6EnJA$U{QL&T~&s{`smeC2I-5mzv=v$l@iF;yN0hMibU=CG^e>J;+9k`Si9PzLaj$>}QKI6lWmO_o+_( zmhxA*0|-Na`+*J1qEMIXZf9rb#;pcOw>EDeDjb!|GumQ2!1ac;YqU|X;F@l1_lemzTN0J|U zFJF(kO21aHg)*KfuKT=BA{VDkOvlx(b{f|A9D69_BHUm#S$F>~`Mt@GesjLp3;reY zP~q>6Tt;`XkjqV?i7lqPbWGh`y<7dq<}pDHl-dDA4QG6`QDq)+vq_&HfW!}P6Cp4d zt>Qnli5ri*I1ILEOGD~3Y!@2^Jmcy1xDXmKolC?at}_6;neEfca0rLHT}NLpoUYh` zDbCtfZnYN&>}m-(F{5d1=)bBuZ?OcP`GmsQV@kn%JMJUIep`Avon#8=ATpEo-@hg& z12f-)R=HCD%pUjvbWa|P!}u)=wInpZG*LHKrZDMeC>Qils^IyY)x;kDRs4c3!DDOG zAptSsf#1X>kSli|Qka@S)6O4un-2aKL?bcV;$*>KSxHovjrfZ^-+c#>;(42yj71K| zzRyFiLrwv$rPcNA{mtv=o(*JDA0kS93>OE0D{KMJzLk$cc_5dCLWnJcFJd6_>BpE< z?aW9;^!;arQcIjloW&YL+~MkNO&a>N=pmhg>{SM<@`a&VeUA`ay*P@R$_+WS2%r?_ zs&Z%c`>ie+%!I=Lz>$9$7a`-`hoc&*dl60^whsaQ;~9~@JYn1Oc_bmgVVyAzUOYgZ z#j{`#D_YZ)(wa5;qzR#zo4a|-ANJjBB90r4Iun3*BkMxw_Ti>SjhktsmR|BPCLt>9 zZ_3eQjweI*-8+HNt)$9^s|+10w@sU!PY{`#BnF!ULS=#{k0Zr5`yOS?p8PfWbKT`6 z@T+PeRJ4`fj5t8bMs)0>o9|C>mBTlfQ*nFG#Rri-Q7}E}+eaz`LmO!`Y_pHkoAruu z`&!5VNnA3IG$}Pz)V&pt&AF!$E{J-;or3vWv3&Sl&9KzG+ae73Zf}=aP*SCI1{?0T z9SAC)W(?DSKOkcmW$(K5Bl?c@(5#>J#j@eq#ctX~$TIjkl>Wrfv%Ey+bl1Z-v?NxJ zwZ9!ae-MsHPUx&_W22?9$mCE%&~lzVG?hDXM%~gXGk+Q!Jf0BspkMWxy;^!n<6JIrSYjv z6F%~$8)0^qbUho9Sdf97b_n({$;|XH9-RHrohHuPcro@03KEPFejN&q?&nJFoIQY; zSI#uL6>2^^yOR!51OLO65xGas55dPG;3=uQ35ZYW04#+~byXQf^7Vq`G z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart b/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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:example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/.gitignore b/06-authenticating-users/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/06-authenticating-users/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/main.cpp b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/resource.h b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.h b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/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/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/.metadata b/07-routing-and-navigating/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/07-routing-and-navigating/projects/final/packages/component_library/example/.metadata +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/.gitignore b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/linux/CMakeLists.txt b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/main.cc b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.cc b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.h b/07-routing-and-navigating/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/.gitignore b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Info.plist b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart b/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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:example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/.gitignore b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/CMakeLists.txt b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/Runner.rc b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/main.cpp b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/resource.h b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.cpp b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.h b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/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/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.h b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/07-routing-and-navigating/projects/starter/packages/component_library/example/.metadata b/07-routing-and-navigating/projects/starter/packages/component_library/example/.metadata new file mode 100644 index 00000000..e27f5ccf --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/.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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/07-routing-and-navigating/projects/starter/packages/component_library/example/README.md b/07-routing-and-navigating/projects/starter/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/analysis_options.yaml b/07-routing-and-navigating/projects/starter/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/build.gradle b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/build.gradle b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle.properties b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/android/settings.gradle b/07-routing-and-navigating/projects/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/loader.json b/07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/07-routing-and-navigating/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Info.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/component_storybook.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/main.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/stories.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/story_app.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/main.cc b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.cc b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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 zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/pubspec.yaml b/07-routing-and-navigating/projects/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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:example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/favicon.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-192.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-512.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/web/index.html b/07-routing-and-navigating/projects/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/web/manifest.json b/07-routing-and-navigating/projects/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/.gitignore b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/main.cpp b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/resource.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/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/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/08-deep-linking/projects/final/packages/component_library/example/.metadata b/08-deep-linking/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/08-deep-linking/projects/final/packages/component_library/example/.metadata +++ b/08-deep-linking/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/08-deep-linking/projects/final/packages/component_library/example/linux/.gitignore b/08-deep-linking/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/08-deep-linking/projects/final/packages/component_library/example/linux/CMakeLists.txt b/08-deep-linking/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/08-deep-linking/projects/final/packages/component_library/example/linux/main.cc b/08-deep-linking/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/linux/my_application.cc b/08-deep-linking/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/08-deep-linking/projects/final/packages/component_library/example/linux/my_application.h b/08-deep-linking/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/.gitignore b/08-deep-linking/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Info.plist b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart b/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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:example/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/08-deep-linking/projects/final/packages/component_library/example/windows/.gitignore b/08-deep-linking/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/CMakeLists.txt b/08-deep-linking/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/Runner.rc b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/main.cpp b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/resource.h b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.cpp b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.h b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/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/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.h b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/08-deep-linking/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/08-deep-linking/projects/starter/packages/component_library/example/.metadata b/08-deep-linking/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/08-deep-linking/projects/starter/packages/component_library/example/.metadata +++ b/08-deep-linking/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/08-deep-linking/projects/starter/packages/component_library/example/linux/.gitignore b/08-deep-linking/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/08-deep-linking/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/08-deep-linking/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/08-deep-linking/projects/starter/packages/component_library/example/linux/main.cc b/08-deep-linking/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.cc b/08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.h b/08-deep-linking/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/.gitignore b/08-deep-linking/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart b/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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:example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/.gitignore b/08-deep-linking/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/08-deep-linking/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/main.cpp b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/resource.h b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.h b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/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/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/.metadata b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/.metadata +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/.gitignore b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/CMakeLists.txt b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/main.cc b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.cc b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/.gitignore b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Info.plist b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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:example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/.gitignore b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/CMakeLists.txt b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/Runner.rc b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/main.cpp b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/resource.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.cpp b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/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/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.h b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/.metadata b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/.metadata +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/.gitignore b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/main.cc b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.cc b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/.gitignore b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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:example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/.gitignore b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/main.cpp b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/resource.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/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/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/main.cc b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.cc b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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 zKpxF`G*X(YOz2^@7i#D+s-~A1E;3&x%%qL5hkiy^JhYjJ74{hvVmAx*6BH`M`!qGC zO9pjEsR)A-n1`6KLACSL%FS_Kcm+?4*z-V?WAZPs?RkzoijIr~I+oh1^~T`q^dCFvG$Gbd8AnTYBjLKYUmayaQz#S1le7Q^Hyr#;X&h*1wDpm+gZC!rSKom zq|+o&UGpeXtlQ1;?@JukKG!8PGS1Io0z6O}ZeL&DsON^I0K+>Mxv#ohK+;ByAZ`Eb z2orY{j0Pa3edA(#-pJA0AaJ6h& z81Gl(pd#j~mrizktoid14K5ig7u8FvZmLLP%l@dl05IprCyqDB?mA2fc*6UB+49lb zZ8`V9epdo=OeZoiY%zw-w`8DNwTORV_>>3T{r)1-YsGSo0E2s>tix9OBqKFBjg#}G z`pgkCblKMYs!Z)r^(qT_c+}gLhR|gnq!1~Qr|~kt&2@_yswx{i$KEn`8J1W8BGljl zr@GEG#W(s#AKKyuqLp+cl1C}7%`m#-!$15XF{M(M*-fD%+i#mFbP35jlgN3{8#A-dmj&OQtG)!031jTwGMal=&YtPfq2AUWekP9J-JT(p099!L`+yen$ zVH1?kRrhV7(mGKkm_jPP_U@Xd;x=ppk}4WY0Rbr> z0MJM_;$GGxL*P68y%KBqHntF{>X&<{aeI4m6+{TQ%~Zp}v%Pujr)zg5mV;cFKqeA- zQm5`#Sd{B6Rc*4PS-rO(vf>YEdXmOK?>K@`L5}|9q}#t_IE%g+U<-1qw3mr5&v;2A zCQ}BEn9_u;;>n5N#dP0RhCF-_UplC+U(i~Zjh>U5+b8%@p3HK(R*IMQwE!uritb}< zF)AK2?+0@-aE3LYkg`B*&N&m~JWB9>(Z>`aqRwgioU)0w{U1K4?>-#i|ZfhNa9hV)2)(%ch zJMH1twoeZWwkE@I!dz$ma+;9GeACv>Ncupl@+gBSeU_uzfj!$+h&@EACkZG_vwLGA z(?^;rcJu1$5H~xI@6lHIYC-$+b&hF1p`AoAOKqw{t0Fu#X`OGt$)7Q!nmJ=&)xjq@ zHoxT4pcYKSPT5(4yzIuQ^S*N2NJpR4v0?rB-^JuaXNLis?E(l>Jo8mUw(gsFLLOy? zEszHWGaCn|lw$LSwoj{G7Uq(zK0W^VVWu#ms8BMRlF2z%-g`fOXmndgC(na8fc)s` zz$GAoxP+l|+T_S4$r1sLwkV77ew1Gug*`|HiE*?FGLm1q; z^p0A0eqqbmk3?|!CB9DBN1Zof6d7+ zJSn!`VD~tVaqy<*Mw^8dM5v3Bvj2VdVFb=)U3L2eDM3@>n(P z?Rr_=I17+r4fE{>1LBQG0&o97nef67n-aNnVP<{dd6*B!Q344 zZbsAof&jw+;CLeK2d87t9s~YZ5?6Qwf&{NPEBN+)LbjOcZRXNcR&h)x`TtdpI+b!>$E~h0o1L*2OddpR9!Gw~-E^Cj(7i69S<66ak$)AYMv|xG+;uR(`;h zGIV3}?+Qxdjz)s;s}jHY{JPmeo@-tN$H@hxaV@)}K?y~ts~E6H(F|SlsN5oH8g7*h zGiC!8c1doE3U|D}Vul1yPmXuCk*hmyU4MG2ml#V0+(G5I+`L_=3cD$%$I=@*8m-LU-!fn&-sZO1%ls63+w}AiAK`Jv z>`q~ztr&&(gCkFpci+*1Ekdv*MhBCzGfPBj9dM|YEjZk(tWBuz4?MGeq+*)t>Q=z6UXF_w z{QDUT4^JQ8J%hW;d2xGB>Fl4Y-bRT!ttP2GE5jYoI1e(eVK0&V5W+>zludt=nf|UN zi1IV;MK$Fy%$yw<oGeW?JIGjmfGLH$Y;l|T0p1V!N*Jvu zHSAG0WpwPip0vm7%VRq8$2O2>P5b!WBfTz*6dZ4Wd6O9Y(8A;nOuG((y?F`ac_u2( z#~17CoTK)1G<~~Z4jXlout{e&nZbDHyHf(=a?OtaJ(2Q(!g#)Ugw-QQ?A?mN#yN%T zBtJ`sA6Lpg`k>Pi8a7GssiY$eG0Be8LCoQL{GDqi-;j0pLmT!Z)szldvbN7GVcu*S zzb1rEq|M)1qa7rM*I8!<#w7FnQ?{v^? z0`MlS3+`#ZB5$DT4+`7e-Hlp_2G0`*F@STbRJ|!tk3cC~1T%NR-p4s=sTT+RqsMjF zyrp-Jv?CD4Y3N&Zb1gr=%`MFR8;|r)uxQ6*X{OpEhQ~+tu}^n8Wijiy`pSMw0uKNi zSNX^Z1y;WirM0o_x%zft0U2GcLm_2BS`b{Z>g|9VOVr%QF*R?pTpiJsEbj4jLVAyd zTA;x15=f~b0^(e*Vo;Tn;WTJSxpI9LmL($Lxob<^S!k7mGhnnVNnAC*g!$ms0#Q|q zs=25I0<>fUw_&+KU`}5P9wlmjRWdMYh%Np6n?AAHQ;JzG?s(Z9UR`pNh79Nzk~DF+ zX~jy>>f-2bl?drlM8 z3NfIQnrT@pLmv+QA6efWPv!sqe;mh3_RcOj5>Ya;4hhN13dtx*_TJ-=kX_kZQDkPz zIw}#e_dK%au@1*L&iUP^cfH?zf1iK)tHv=t|>-9mMT!;;Vg|svSzWkN7q#t$c4N$Q;tl3EYwef_4q>GO<#I89VhY;`X*hz$n*GZ%f+;uViG z?uLlxD1OIeid}0r9%Ssoc7@vJjZIsZlU9zvYpjhYiOrzD5sq3OC zpf-X;Nb!DLpxqX^zDIK%=46-Z3%i-bac`RIBS5*wcw5Pu>G|kF>TQP$dGRYh#1hwD z{|cbbTOKL>Gb1-;X6?vWLC+KJ_^Ij?KzJ7eZ?^8XNgoYU9^z&>d zsIjX*uOK`#Wu!`>L@y!=XpQcW+mBaRjm|XrB@etLdr}Ob57e7EkE;7a*t7=M#XFL6 za;KHHk-rBNTjp-gS^;ehKNv>K>+_jPQ45J%4><1HyKJ?;T9#~k_23?xD}B&@Wp{%H z($hU+nWR?g!9dsJkgVz(J_Yrdns+m~9V_gQ7Sb`&F4wZZ!k}##j$>O{4{?avCbCZfyW zO$)m7LE=P?$CXHDU_RUD+sYwT;nKI7 zSs_XTv!BuxpJ!7(b~uYfsgzt~mj5(vf2r~`LHwpePs!o2A3zEr@#sxo8HEe8>V||d zBiz0@e&6}p*}!6jsm}I0bN9Mc2(c#jg@;Nu6!Kv&4&P8-UcQ-00WJIO%4OuUn;^jU z;I3r=T3KQtiMQ7&x32eVtB`mCe)9ws^7u%2P`B%Xc}=Qc&O^{FmS^{~Rho}^s`B+H z=1_T);9LRK?{$Vx22!5m)Er8aoPOA8&{7fyt`t@~Vw%gtx~+g3qs8LFR%(2Uny28A6dFYnNQgcUa>Sq=%alFh&8#@1o_qgwve* zVFimnUtL{4aHP6s?FB%bu2SP=e*VGqXC8iuZ-JOc{5%Lx0g|VvyWkdh&FD^Gkc!0N zhoolXvp6GC8wj?Y+V;r*EN+<1ac`-+!8Mqb@Nz)=OqV?4gxhR^t7*+^+AfxxVt(n{ z+fkk|-xSGqmkZa@Q%`;;r`-Z|? z0fR6b@l%pTwK*@xY+(MwBUwf^z+F*~piC64BWTrz}-HS1-XF-IA%?Zs_#F8 zcmUuEZ6Of>YIJOe$&{V;3vIBw7|jSGPeS6cvTMdj96Y~pI-z7InGW;(DhFqaiTTO9@KWvQi9__j0btLZ9 zAa~-Po%^sDFfme4@Yiq}r`BgnYK2eTwCjg9_zC4V{{&_GTm-!qHGVR6JXDjw;}GzF z6lXA{xo1+tQM{9vwb1&sRXPdGDHbEMbnwh}t+%tvcw5p4J4r#hEpDl=A{;Mjc%0)T zsG}v<$^HhdcE)5IJ^iBWK{7?Zn)vb%c!5eIj4 zbT}CGO*u)Od@^LuIC@_2{=AP2-O99NglFudj{!T}0e8wtTQcB@F9QW6$J!0Ye`T+U zXDx84b$!hD#4YzSyZLy~!IIZuFa3%eU zG4eg5?}sZ6Yj29P^-PcXG*8%VzLL$0!oL?c(!oQ+G!kORsa+lsf5YER>PX83R4LgF zgPNQJ#Bo#)MXU%J9k?RWD;c>|as5b5p>xAwau=X5XbERX`_ZHB8_XSNDe`s?n(e>) zGF$G%n6o+W{6A-@4hsIK0*J%jpB#Y*G^B48eQD(CDZR5oBl-P=)r7fH^PLf?!aK6V zwkIM35?l*I6p@;^H}JIDNs-fF*IFN?k?kj(M)QKM%%?dSkf1d$Nly2z(>)oq8z}0H zH?Qa{x&36#W@y04!9zx@x7un@ob$&)V8#f~0n1|jF0kFs4aZ{ND1~QjWHToIY5)LY zrgKDCj@dFCx&-w$QMi=CqD*=`$NqC~2k366pPXl#>Y7A=iQD}f`)+B-pS@LIW_M?9 zlBS_)(vGz!L$#P`?<3Hvonw@B1uJ244y)M?0)z0-hq++sJ0GZ+{oiiH;lFi&wy(C! z0Bv9z^M;`4@)USP)7dhg@K5K&U&|7&-@I0Sk>I+ZH75_xEn>qh9qmc%aA@NEKBsVBgUuK zC=b{w-0oU|)~tAVI zyJ3BAB}%rsjz7qZ?x_XCWe6!_u-{e_3u68Asso0IvwKdxq1lN#%4w>J zi>}P;$JZ>58(ZAjsmSJl6BWUTe`0eGEf3f_yS#H6vx;UJWO7CCK!{)4C}`C$j5gNj|k znb$4QRurEE3tPEe!JzG-a0DmvXePO zSD#Q-qOAjTMm|=aBSnvwHoEbgyVIz@J$hT*legak-hhb}e#%cm2$nR2 zV9A{kc)WT$np=5coPQIskbGMO@Fn2NxPv$@SJZdG6}jV;+%(cH+*RFQ(+DjsJlman zy`D(yN?8MCtjWD3w}Q|jQccb$}BDW%M$zZZnri2+5ls)@@(wQD`jt_GpTKL_^CO&SSCcHbfMX#JXYFI^*947 zPh&S-G=l*C@`E5CU1$m7ao(Q&oSmY7)ZZ#5_fEyYzLsFJwJ%GfErFeRN@7lUbUrL| z$6;gQSNsI91LJvT+$Zb0>g<4g8T{B!U05lfKmoSRH^pB^^8sJ3{8PzVq0NeypMF5k zU3qOqksdq{>AUjm3O~dZx^vS6C$ldgCWszl?xd8-sJ;-kPnISB*-f=L*8XggOx$?u zg%B-QovSjBbj}%sShZv~r?`*6PiiQW;nee<-=+y4}S#}q_BgXIJoSOf$YbE7vXt4;Np zrKzZf6Ny0aES8(-cqmnIGMg&ieYWryBZ0VTB=4<*@auP4NdIk&q(Mt(OLPm|Yl za!0OpC9sA#tk>OsaCSx0;!$5r6naw ztzLBo>#LKaxxsO=yWe%yGilL`A|6E#TK! z+1VRQlo*D?(k0-mlRM+`OMT8kVB*-%ZGv}Aj1u^j!wu*~>L<-T+u?6sX!3C}lQte- zk(6_=iwXsQ0JbRvJDwMnk!c99w~s~uD_4vMB=m~-ft-*|z~$*g4g;pgG~Ap1m@@Fx zWS)8IKSN6`^vVQ8hv^Oc+O(Rt7!U%wVsGP+Y6fyS%GG+v+dIdVfCXPzAV~~li+3m5 ztFQmbE)(#2#Oi@k$1#zUS6ijD_yYsa{+BHZAw+^zAEI3bc(h0qm?|pNf?oS}Km#OG zrOfCKn_-CVO;}DXu|5YE#d8I2o>}vUxYlv&>=+I28WY>a1;uI)HUM_IvpF;Ln4ROT zf!=1rpKihNFUo=R@sD-pT!EOm%%ncl43f;aem^;|A#s3`b6vjeAzO!M-gwc`-Kj~{ zBX)tq64*kJl#TrgW4o%hTY3x$P01nD6a6s2#MmwM$vyX5PU|YngU*wXGK*?f?#Eg$~^OWW3I@of-=XVuu-b%A1Z|nqY_2 z;~jD&=QnB#WGU>;RwFq(I< z34K1fCMwf9F}G%k(&?~2EY&)W*-_z0ReS$;7+I1)zz`)M zpAF{5ZHLPMJhYU z;GE*@hM1NM{G{L94dL$!Y-h6A9K9W=I6AYb`Y=v{(tpyLQz^^Aibea(q()R*TU|-m zozpyr!|-BZ_Dn+$*2|vq2Y@ghHo!-`WjVtU-bab(SJp2*2i-}$UP9^qnF_OIFS~-< zYj^VS!)Wu}vn6!LDIt!HJ1SU-@ce>z8f4cT4R9V@O^Xg9)4`VpjsXm*~@%l^Ux;Rf#Zck`BNXu0Y(!C zj%Z}UAmD00nsOS%Uull)dU(fZgJ$bo>3Oa`8h~Wt)EM?v(ndlTS1p0|E9Pg>=&>58 zghD~%R;YpqZAw;F;M(lx5b_wkVbnd+ER+6A-SYj^1XUgNGn0I~ES|f|5emjyPIW)S z0z8i6)BZt&h(qQxih4HbFYa6~jyeKbc_`QEdLD@9SBGButjw|b^l*oQjDk<7Nig08IK zb`ATVGzK%LP+>9aFM0hr8t+m`uNr?h&8o3Rp$T&ql||K}7GgobFhCViaDH~+F#yC- zt>7T3&_PZ*feTKTyd6vlF~JmEA1f+*>CCE4ex}5N^$4o)YuxX&3T$P0(IS!+kan^J z_p>v#1J8bWELml|S02YAQe-&yVew+kipZr~H-I@yc$=8#rZ-8L<_nDx&Qv3dJDwUX z!)@=h1`~R2M{$J8bM^1O&Gy2oxe1T;K?NA{iv_eYuhpLyc3%xu%z`dVc}Z}%cHGHQ<7P!Q|e?dwnSpL!AUf!B^!?#^Q#W!Ry+7ofwPZ1mZq z(Id0{htmX1W?2cAYWZo_lOtT#+Us-nlP$=CGK|Ri4x0Xh>(|iN9y1 z=9y26A4Y}ViRi9Fxzm{>J`YM>GX1D|$4BY9xJrY{oY2~Z&};B{Zq9Pp!pox`8e#0C z-h~@fohA74(#ws!{7kIe4v6XUX<)9bd)g66Bz%^Y4p0~OF+rY;l$v&7T<3~4y!bv> zR$r#LblZcVgy2lq!ff+>yuR4qCcljQa03x|dTcG7`CHcxh#POtGKt6ymNd_0qF7Wf zBj_KC8{jl!zZ>0neDp19n3sD?HC=|WM3!}cK4zCnu6Uoj*hbV1<#F2BD)@A~y%@VXx+u}Hcn=_s-({PxzmMZ^xJ1SV zoZMY*FarYvO_@z8Lr2ep)%HgIL7rhYa~#X&&V8oYSw zA4m{3{hw1Vb~~26K^xro&e7i9eg^SqK0i}kG3z(!_~E?sjJlSWIWXJqKiHAWTG*SpPcCMD`kEc1gx`R^YkYWz zEN4vEIkj@&e4tC!(_~x`-K$w6CU%X7U2Y z)Y}T5stEyoSsB{H{+xfST3tov~6@lO}2gx#N(rHXiOAHT!dp6FiV8V)B4{L_P_% zmX0rPa^-{1xG6|#uEGo+!v)QAOjRe|jg2ICcXU!|Cr+LMbLHlhJ)ErR*P9*z$NLlt zmYjAUbljq004ZyOco?HJovV7M*Wb2nF8vT2D;3kGi%F)6Kr#TVW>}zTHnUQxoGmD0CY9J`|d%8@}n;_co2q zWr98`R_c@PQbMi}x3bWo4XZj{it6qYj+o*XvNoS4>rF;7WNn;vA*|A!3H}Wh-uk@n z*hV0S+XnX;K;BOoz?&*9_{NnM25s4^^QUt|>R!()^Z6#G3OmL{CU^-IG_M7_a~B+& zCrV;ouC1ljbK(K=ygqAE_-}ewnH2&&t0enS7}I4i0wJgNvCf|P$`|DHku`K`HfDa2=n@DCg8MRi_)vpMR2Mxy4PE2Qe! zD||kNXy=0WeU(43v%md9Hg9Zu#CP%d%C67gk_#pfXs8lf>M=betm(}0fdDKq0{26# z_c?J!Cgo-~*=wswLXkR|W8d+rDdV00`22Ouv=_Hod9bmB!=D$I4r@7DZX7e+0tO!9 zR{0d}A6^K#yRx@ykotO4(WUJsmFvN)d-o-wZ(wcDSUS`8jO-JSAMa4y@MK4fDP`(P zzxQ2})ofiauWKj9{Rm$Yw^?g=?`oO(Vf|T^I+-A+o1#F`>tn59d=FtgVJAV=y;G&` z0GMvtEeil5;e$Ln8-41(UeMl2kYLk%vPl?0+Egg_;g)494o5FsvdeZKP;&&fjw7o{ z|B+e%Z|)8Ts?=>@p|hr!nYXgV=ZjI4Cp#$E>+g^6r7Nd3<>-t=G%B5IyZUI{e{49G zqnIXEB=M@5Ndf1J#l5YWcLG=A4ufF8S{z5Kz-uM?Ni{{%mr);=l0=473h#cIc{K3> zZ-VUw_Ng5^HgWQhs5tQU@qv-YBej9`R$a^|lknX<*+sSVXue8M0#EPBJ6_Liwl*8l z_zoD#!l%WIXJZ$jm?|zUu0LdeP&8IW*(|39&QzKGnem$6--u{ZGtHt#Hro*h)?lu zXGKo-4Hv1WP*VLj;uA6UwGSV*6ro%PRbwR{@tXoCOb=OFTB4ru-|Id!rP5Y6LF*-D zy|t0qDSVPo$ffyoj#CIZV?l3VsPRYye$F^xxv~Z78_fwlCWbwW!nYCR2nx0_+@tg3C_UDMVa2Br=X3hfP}^Cp4Yg=#OK}K zKYVY`V9jEKD!UrCbSX6Xym2T-cg}!n;?;o{mM|zWj0P@D|FO-rQ zKt#ApEh#AX%_f%9!G6`I*K=bSnMIhQ%W5&BOMntzVr*eS;WR;FgM)+k`#+Vze*z&V zkU^I-R|!Nwy<~>eeQ~hJqa2|DdpX15kD=6U73Du;T|VarycBP^n#IZeIJ&H3S9#@oec~poZELqX$DAc>XZyuIqd^GK0Jq~0kI=d zA7gMo8%zmkEdnqMh)tkp?V0I;Tm3`>aU3^~dXw zlhdd3=iygnUgYu#GRhxln}4D?Gokczq?T;RjCk0=fUHy18$lt!-q!%sNxee7No^+N$9d?Es*``)0UJ4SC&FNY0pf z_MlbGdUy$|F}YDvJ9GTCkZbsNKj3DL5;=BGBx8xI;n)=A0d0j6MP7Mi6MQdk@Tux2Qy`oI_&*%EQ0bE?|R>P$rDhcFa8O?JIK zPOpFDa?-L*+Q7RrCg#y5z$l0d>n@+OYo3g>-Z*x&`Jj5|=*UOYaJer6;FAbdtt0O? zrFGUE?!XeUG}G8wMgeTs%+r;3uUU;Nq5EuU{h-g&UOBKhdS`;J=m!~xn*ztv_p@dD zR)tR!P=~5kX)FRsx9)uyuu?0dh%Ht7`PTM@e#Cq!z2ts;O;L)tQ1ipDiWqbGz@o_p z^D=UKR#`S7HAt4vQtD(_SeWyj_av~#tJKlb9>-s5Ykuzx_E1ZNl4)~f=zG$*;-y=T z2ozmFva9az<{2&63fQ?(Q8{IPx@t1LuFcxP-LXVctWh3AwazVTt2)w^*Zn-#eB`bD zSHoAusjOBK5(>uQPGj=ijdOH3jqG?(<5#C{*JQ?Lt~@zow=Ii4Al$Vr!#+Cf-gx)A z`_h(>b@7?*6bYM8%628gGW^rwWoG$mK_eCk`}B&llStfwHf12*{5spmTeNH$4{gCY z@Yuwr*k@%m;T<60bw9z6^WpWi@Bu^qe-g;YAzI+VjgsuZaGA=^G*I{KLy@rIjSpWb zFQNsCp2T;S$VaJtZ<(waRu8y7^X;>YhsWp zM)mKgCeE@K;J4vQSV z&-(Gl5AJCp>K*2-`U|4i;u3p8xo6(isu-38>cY zml1Eo&FBBKJpour?}q&nggpFiGM%m+YX`ng8P+uRnJiMyWcv*_AZ8KAB$w;rfmN8C z<-2EB6TqZO>A~P{*<);wYqZgxQS8E*syOXvGkGxF@s(scud0uv?T)fQ z(DGrwM7lvpitUG~6!*}kZUpBn9PuP`5^nMK@($xI^0Q~axP5qU>L~uF{R_<9&m z({}$$WuD1y-QzMVb3jLPk`~bDJNkw(Dv-6cKUb4uzD= z-w?i0NZ2K}AbT}Zi^uOZ32xmSxJw+6(3j%a!~Tdy-@RxVx6YUw2|V6JX+mSJNclfl zF~SD#eo+lnB=ZpHLl{)E+`sI^-V1Vn!6#Ml_W4aH*Pe(++sNI`M=5L3?X1z0;CJeE zJiX5Mp6JH*=R9W0t(1@>>1y=lP^F=yJil6JxU~I}EpTsBx?rJ5LbCbQ zuLBmmX1MO&!E}khx=+#hCesIB53`IWwqyFtR{AUv7vJ{Q^dn1S0@*^UOmRwctFy&> zd={(J@avBzmu$MbyamRMt_$kfHY<*v)%%&nY4hUDH=$k)$8LHlUG0G3Kv#T~-vQjw z)hXbsNIg?~b-jRw)ir5Q(gfwM+Zk+0haf z+4ER%>T8RnKAoJ-(s&tu&-iZ@A?^J|d z6md=9C4am*v2r=aa&a?~37bc($n#wQ<8UGXL+!RtrRXGSj-2INJ#+3J=}e6nOC}G8 zN~lvCS@rxoq7w$CLg-wx!%V%ymw>~xhUw4cADX*$A}D~{21F$!Y61aHwpdL!QcrsN zl~$s5kk%7HWHkZ43%mOcwlk3RcbKGQ*}K(Fxput)rpE0zH0vY(EyY=blQZ`odG#hD z)~{&r6XkSE(^csqsaMm>2c%xsT2&g_Nab1bTY%fIoNHatDY@C@Ei~v@19|F?szU6SWRS)uDXqNY!48RlAb;S*ijqus; zp;bteR835>3BXML2CewOM<^q3M*ubU`}gnI-oS&(vf=GF|JJB-inGOH_dc1xb|iqR zWgrcNy?1*8)vAlAaiBE%K3Q>5Ygy-#Wf$>FqL|Kvgb&6H?iQC*Z|PN)xZJhH#d#=a z@s9O0oea6Lg}submzNZ{iZ*_okZ$6G*h5YO!dE=7c4=YA9g$y%1xjkVl#|1DShEjM zH3(sS?uRfB3mhW5Wrm} zrY>KpBxM&CC;s5Ie_{o}upN{vdb8x<_$5iiQN49`z`+Zz`&E`yLAim;X&}$HAfKmT zkO2Dgdno95mWMH~h2c4);H=MigT8hyzl|4g;dU7F;p^X>w!fa0zf{^rf?>~ z0w{=F_R}ru{g5i@&xwC%R-!-1x|(k6pSb5_)$f`zyErIvSCs{z`iVvU4x_znFKti!!av6BkRX_=+kEc;*`_rla zB`g4ruCJGT3XVTTrlh3Yj>1>PNIy?sV%Yo*=qaBIOY87_?P04yx6TV?_{~K? zOHEo3|2EA2JAMPYZM!H<{|!s-$r>l5{19icxV`Wf-{<0I>{v&H4FZaCy$B6Ludz{v zRH!!HV#JGP?5(L!Zp#}NlOODgWqjO+yo~+LasPYxH+ht2KjdfCFQr(oovP3?vkFK^5FvPJ4^LD=DpYQi4tUXuY1;erJaBQ79 zHcp(>mKvoD+)bq5SX9siR>(%CL??*D>Snn%p}NfGO4(RY^puLI+j$Pw)NZLb5bKo{s|0L~ z-A3R~;QHMg0bHSgESOM&N&@oF4|8gkPF-nVM=sQ;d}wcS{{!iW-)yQ``D6t#xlh(O zRF0Z@O>0uMz9g)u{P))ptV5lH2(gC8I5i(FDRG5Gp1bgBydKgxJy5gBfK(#D7NzZU zatG}S^z#KL*Do5=K*F7hk(`mbdgI1XoM!8*-};#UzNtEG@Nki#`7)GfV;VlfW^)=` zBaAjK5>gx@wf_D!B!2C6xBK^K4%x|+#?P@5N7tlfWo6xWJD~Wz^cnPfFF($Ixt4!j z9%x^1$on56XZB0Irm^kw-*rd1YVO;(*LbB21@7OPJspo%WO676#~oUMws(zP#+shG+$ns0IC3W z_{kYU>N5<_6=j>*0d}r-?8U+--eXfy2M+opoYL|=I932TMp=&k#tzJ^72OtRJ8BVOvTYPh;@EE=LJLeOk`y?d|Dd9%fWlhON^LnB^6x0LyZqz@imyogJ`$C@Lr9Z4o)ZQz>NCavG$$@e2#r3 z4I=}I5KgV>wl)~_Ja7gLQGju0c1{h%cV&6c`doWWv$>q*=ZLc8J{hBiKXNK?zx2Nr zz!pph;BLU2OaZTv>Pzj(VpSp2&OWNCF<~>NgL!nezhxEgj;&2 zl>z@V#>sykFCnFL?|(j)J3SFr|FFa`n@KbhC2pZB7 z#3>qIn&~mG_Vki=p8_x&CFeD4V7MvgJlk^G7H;(apFxr+7Gc0+1KfI6$@aeF+d7DJ~_-A|H=0?Da#&^Cqb=!=fVz>giW5nw=jWQBS%L^t1EZ@ zCm9;qlG{($@0W3T&l17ownc5pWhfM8Mwn-fLtb7H|IYl)8@QikEc_Le+s60x?&B*m z5kObB5{BD}gGr7l84~vP{N)C~3V;xhBWd%=^j0&KBw3T3-HU`;hqWA3OWW~<8nl-M zfYn-BI0_?g`3$_;&Exw<(G{QM|8)Kq28x9NF-F$>r@_BO)t^T*i-U1bX01<)zC_uE zR@8qEQQ#cm$YbXIUPVO?z7KI$pw@r=-V{V@>dC9Hn==1QBVy_b;#*jR+&f*$AwCl?o&G?2Uk4=*Ej zFK^Yvw*HTO9n!XRBWe++o3)4O!OC9PC=_l_<$M(W8(Akk`zv5?nJifb^rH3N?Hhio zo$=nNmSEz_QFHj|XF!vQEcdqPyZz_4|M_GBH)k)KA9XGRlTJD;3*y1c#?ZWkeaQM* z^`Bf04#Z)ARgrE4rMmlk8E5F=NpaW8xKNd3)-orW$m+kh(W12jQbQ7oi z)=#qbmhkplt}u`FC0sV9sdnb5$E!zX_xlA{4wW&j0*DCm`=1;Sh_sB1xiH@C89Z93;8d)EUk=lPNIZ`o3H`Vd+Ig`=CV}#?PAXvzWk{x96fn z0(rYh<>?PJ>Hd8v@c8=*vm+)>P1k@i2>yMaKw2nihLV6Z;wcdc*E2{8=xNh(FkEe3 zq_pc;ISw&}`?lqKx<4vIa67!xu|P}G$c3MDyg?u^InS?uM6Zzys0QM9ChW>g-ypzA zkOUSfvhTTWq{_>TJ{+kpgwX{@>P5ptiJ1NTO5)8 z8BiLUY_!*AJ$V386^TicK@z0qOPWP#Ea5?}!$_&fQ zOcRKuR^tLX*&CM(ahYftiNg!a=uU|He)2nU2(~iX@Yo|foZp906;o=d%aK09YEW7_ z-yX*;XE#z@?zZ&fQ?2fYX!T8@-$(K5Jo+AkyOM+(944x4B%2NR&avFFJY^9_br5UtzSX5@gmYYm@ z@S$jtqFn18bXQr0IYhQ=+2~ZDB_DRW3d=*B+3q`-*1P$i!GVIG(AMp=vBQ#^_mNxp z(;4Iz#_~&9jZ}}7oW?R;_x8&h?b0N326NJq4~>W^TeI^!o4=G5G{|9ff|`NN5+?ns zL@IWva(*@PXPmVGQ#rgIOY*nnoqNDDy$hd2uMT>wBgzg>YT&BV2U{k1ah1(1j_v0` z@o;6~SUGW=!+j!oa9ko_2^G75?VolPmWk=Pb-h{k=phZga( z88Rp7QzbHkpYG!aug9e^DF63Bi|1#CeAW^CpakO9DTT!p$yhuT8Aq10^cl2O@Zl-2RXr`+zCPj#_FqXs}W2{Qvn2Y{BmNsG45? zB{BF_rVgT$u0 zE8o6|@C>uOK1Ba}!V zx!M$9J1B7#_JSs90cKlucib?T&HqQpLE9YV1?v{gh2NWKEt9FX8;3DePnCL5Z=k)Flp=?-i$<5H4zc z`?2ZZ+p~Y8FYr;m3Vn2(u5Z`Av6#S}zkpQpZ|vNP0DY^I-oa$HXzg+ajQC7%wldRN zfOAL!UwFtuphqqR41v|3He4cQF5;UU9M~lti-k<HSTs^#>-Tf|C2&~#m%6WZAy1jz!Q_-IbpZP z8ht8}UG13lz+N-7+01+RlE)6OT^3px7fn@1|_b7^{bhPet}< z_)77(<^>8-qQ2X(n4faVhm@T0@Z{5HFSWs~EDXtV@7IAMbVUP6;v8^%l3PZ#wOZ-* z*Vk4lRj6OYpAZ_$*`t|tYKmLar&&{5{d+5cst)rQTn`n8>Xi+0zXc6YbTPMgzewFg z23F=+`8=FXXF6b*CDVN$v3|6iy;TSFSYh$qrbhKDcT^U9l zj}3g#zty{k*>s8S+>t|cng#3@Rz`z}njy{*?90mV6_Mkvv=iL9pb0ttHf$7;TxkX1 z-klTGb`2~-Mxx6~+{b-KiFd3XG`p?+6-0PMorB#Q@TY_CH5)En#5WrmHqj;@Fvi1A zeGpO@wuYIPOgRY&02e-U+j7!$LZ#5mS72R3MJS^gfheL5`kQV_n{8}KXaj)V%4b~As zFrQ7yZal}~{ELX@8c#V?2LlM@)g(|;VvcBjEuTJ=`WkOem{DL!+7Lr!U;F!mGm_^~ z+V^T?%bz+8noq9{ybcq16Gzd^fS2`skac)@6|;8X8l6Q19epZ@l^3@1ES!x2XLNA4 z_FI8#x5sq7hXVr83D;_5$sU!*Ye}zyx1wMC?Q{DSgrUx#fM?_Fj@{syA2x2yL^J{S zPPLkQ#O+9E9a^H*USdriL6rGHDt$B!vu~t7^)@_e=(<|SVd!MenX48AP(Z$4WoC9_ zeN;I;hEAr{ZvB^gK*1AWfI~5H0a{Y#2UBjn9`7;3JDrI5leeufemoZol*pDlVTSHP z3#8@6kxsJwUFg9(;)>Xm!{nsFC<7}Xwv_?o=eP)$>vvvj>yw z=YS7{pIOg(u@mJ%G0G^TM@L6>l)?_{_e`(yLxmX%h*D zMJS13@e!}HFR{?GNtq;%=4#zUgfFP^$g|Ax1<`vC&qIPbwGNo}3>ZM?=Evk6r|J&S zi$UD-za)A$kcqu)8)1mG z{FI*zS4{wM6S3;RP-!$0&8!6*;>|%T%HJxZt}cmap#~4vD0Pkx22gBbPo~=2iEMFa zSN<~qRz>jf54?e)>3%j;Gc6C1_YO0C|CDQDt7+bE({$0($tizZ)xn2L?@6_ zR3$`yiwH?E%X*^k*^oQ=z!1GA|E&fXHPR=rIEGq4%0=SGvror2Y%k#d`aPmx5@~7a zdkmPa1d-<`6M%& zp9rn|?C(5SRowEcasXoE$)s`=GvJk9wPt|2VX31T2F}6x3#(&IMqZND*a1muBh9?X zX_HSLo?$y$a;qFx^U1W|YAd%)Gaf|AEHqZ*{PW96FF*&nO-@c?c6t5=K_z@2f$8<^ zY}d|9NRviy7sF$61>@bV$B3*VeDg4DX3qScxVTL~5Go^T?}aG+th- z2`EduJx~ZcSssR;yX%oW&ze|$TF?;>HGHp~Eq?$w&SAD?d#s$$|4F@l*T7}X$7>}7 zRvPwxrPaLO5X-qYiQ7{P^4Ui2GDbq&DJ3Yu`)8zfMi1{>HEq`+uR1bJ4x!#n0D6_M8Zs_# z3mc%u30aK|avL-!XI&?{^%v4OXUr4OzaL*|-HV&M5GPx)SUqYMWw@Ex;%DHx^&FOD zncjYHD@AiYbGx1O(rsKW>Eg}cid)6bqA}!r!G{?x#)c?^k+q_uv%Xh3ha^A^{%wnpRPY({1LqK{NQy>!UjUc8f7x2` zgyLiGpsKlFO75ee2#drn3Glyna)PvUP}e(t6P z(8^W6g23+fzT5gZQQ^L-Yg#^P;QK8FTZAe)*|CKS6(I>8a2aoN+XEkYf2jAF!Zi3! zjS($tF@bu(ypeC>`IZtF;jz`F6A-Y7ZUQBuZxp&q4zHb9cc*!1`T3p9xL9`nWhNVr z!2lf=fCA>;1E&E|yfmrHqB#XnUCu28b*4#eZ{lLL(42#`ui?BO&uZj|d_Fh!Bw8g$ zn@2uezsJz@^XM(T{!CEw+EyG*eaF`FuTN%C zOZg)khBpDobCl(3ud$bhr>EdmuQ^l^Cic|y2m>LM+gsZGYKUAeJE5YUX9}j^JDoojv<}Cm&t+agmp?JE0%d#fo}m_cYogpjn5&egilTvDFz-Df}1i zB4)bXfn$dqb!cCa13DdCgMNehaa&${n5Mw&bxeKfNmHq%e{T_H@WB!H3QgFK2gNpB zP<;xkez-y-Lr(0^P^G!YH~WLut`0=mPXbVN64iv6Nd`s=eUQ;?V((+QU0&B4SF3*{Pm$AVrq;v&)c>VLy_UCe45VEsI@ZWM2TaB# zRU6XaLx0^H=0)Z!$rIu`3*s{Z!W7pU@6aHvX*vUuzME+!B5H}k_gFD)3=f;nI zi1|B!@iO%p;L{!JSEI~vyUByf_{HY=;RuAK##-h!06XFwxYi?xl}oWStJ*P{OcVe~ z_v(y8!+BaLQB`(D(XrL0ReKMn$R)8mU2@$q$Pq; zbZq-$IkP4V(`m}e<)cwnZLrjiA-X0@VY~Gi5-PKX20#Eag!JOw1br%7Rr}`(v@d!u zCo@&wE1SwM=zt~$K!eJ**9GAv!}Cogn9(d0X~BwPkU4gaWh?WVRcE3N?C%_R_D)Vw z(YmJTJ_0~fhItqHPqoIFGQYE2!~?aSRa{vjcDWhy5>oT zGOMFTWfL`aLx-!QL(9r?~D6y9Uhq=af8z!rqg#p zXk%gE-;=@G>MUv7p@P#ni@zP*$YQwA0Dlc21`%pV;p!_F@xI(^eA5&SZ{rU?^Wj}! z6Y%C^eMYilc_~MAwqV`h=I0;WA)MqJ^$IvyJ-O0)*RuLYjTL1TWd|(NbhIZ;nOop( z`4bc=fsxaeI@zc!vvYFFetFRKSMjef2_#oIzzPIxZ4oB0sxKOzX4Wltz#G@LD2Qr5 zm9o~xF;EU*_!O`}IigC{sU%1^$$B@>Fa_H0*>*1Amc^7tnKxcPpr8zZTme`6(0@J| zXfBE;0)lcuv%tqq05V8P2B^)Nhq~qdR|1KCfe>(GeuFaNc)T~zvma>o)FZv;sVD@D zynx%jpd8m<{zI zz44BQcmN85TNhy2plu`Nt$b;sKELSBpW)my@*ZnL{lFaD|7-8c-;zw*wh@(1yH+~o zQd6mwOU~P(B4CS|mX=v+F44&NRvMbQpcpDmU!|BhndzGgrsa}~;RGs*v>~aLX|A9$ zxrCyC3y6ZiciVh3@BH@t1LJY%FM8{e94DY4JQ} zYS0fcOC|N!{@iq*a@H$Qe9ONriBWJrhLhC?o5K2)!=~i)0hGh-mMd~RkqdIGCB(fU zy5*IvHssJ&gxudt>g(3w2{)axskJ_#h96qTc~<{c!`n^f zg+SOfdm8=UI!4%}d%RkXd}yWU1H66h)eDTsQr!qkcZE^zbI#F$k(dn7l7z}@YSv1+ zIcEYw{HJjfg()x7R@zQ&o;LdJ2vi6Fkl?OHM-Ga!%w}co(6=I5LZ>n{9pr~6!z|S$ zq_VfE7##n|{H(t$wPI-D`~L#((@V(MZ>p6Eb8k%4{lIGT;hZ9cg%~HhcbDCd%0RbM zs?uZG1wSL{Z0f+NzDiO?w9~XT^dWptKJ@M~0(@5*az*ZgabU465JN9eFY7vD8Wdz_ zlAIonnlivB;uDXov3sIgoKx2>G6a;@?v0qg;r`RnZ{4wMw2%}(e*c8k`R7sNT@>H} zfUU~mHR~8!4rJTHVlT=v3wz2kx&95Nz?@Tj8)s5E}t{|AFA=d_Y zOTqb{ATx>U``k~NJ2hYk3r#Gn1}|1Xj}jq!9%;{k(?9!WZt1z#{OATvapC-}#$LWi zi2R>~v0v6A<|?Eg)Ye#VyRyr7RJ$N4vFEFfmb1jHF(yZN^rc!ULDen>KWu(D9Z5!P ze(qg(G2HmSqyi2B&W`vo@N=3l?+dXbWn-`1LrY1^_mSilpKLLxQp}@s?=Tqw6Do5Pui*IhPZtaT|GAE&MF$;(4s9Bt5f+vbITElRv3( ze&@3GgY%ltiz;PZXq||TeA+sP9bc(#*G<2ck&zF3W?0$Bxit`EwvZb7jke;810>h3 zb}}!oS_xUbJ^$_PWrSlJ-;v4qq!@|L9uM#ALcMu|+|fni+AqPpu+CtjBrs#Y1jKVU zEc6L$d!2l-MgMi5&7?{Dfxj)qn;mIZudn7I6V$88%05A!PtCQTGSxXKMGh;qXa|fE zJBUmhM!}@e#A?s%bajm+=Ka1WxHZWaj;k#XT{T#;bH9c5zA8txVHEz(EeE*PP9eD9 z<2|evdxmVLj_n@`lp>6@ zy_ZTczm54_lGjPwPaq$dF1HdIks&Mp;%bge$QZnnp${}#&Z3)z95ei@b9;c=kJpY- z$G#RZbgyTi3&d4=3%+gXOSp|g^~^%K1id>re4gTka;7m@WA}bFo`GUbT8-n19VVdO}IkuW(H_iil_S}@$xy(Q*fCcNaD60 zxqsWK5lESLWnKgy^ci@da#k9^aW5)oLzbFxlUVBA&UM~79PF7=rW@Ot`>9(Gju3N{A4%EK0dPuz{=J_LUv|Pe^*x3eq_ExMNjB3?{$+xH^_Y z;e5pH)*~Lo@y=;b=P$Iqp9KR|j(>D-kaI4WeI&&HPFRtbZBMiQ^PwE`pF$Z7#(@UF zP2~&InXDTNx3`4)H2mD8yHl{Jk(|C(VA2vwY}3IRqo*qy9HvN7a!$$hlZqjmb6tZy zp1fLd^be5LmcI`_d3@@A`jLDS!b0qXVvP%y>+DfL86Ie=*TZ)PL??Lk^F};4=dwv; zPRBV>*)f&NE0vtjYHw@vs9l(Dk*g-}ARSciwv!f)E361d_9y<;9b7)PBw$3dh`AZi zAY4)BVh3t>;gR=s)nZW3PT_3bOLDK)eTZT^*m%P!HdC!FvK=Z=_iA>Bg!`SsC|P3u zz+oMr^PUcTebccFK>bqp475+?5RUC{Y7klp^p=Q;ZM+c8Zq6wBtH*5c=QHlp7wZS%6AszeebN>>_2^H7uuK@g%1{vF}DT>U{h`}c+u5ubXcFMH)fZ6-l z!y=qVN>jqgj)3T!mALcM;1!8}PDcMCU6<9?l#euNff${zE=b0d%;TcPFfw`y>zjLg#_WgnwatH|t}Y&WrR32m5W_AWNa`OqIc{ zW{_mX(Ck1psRCgMhJ*hXhcAG1ocb_kuY)%9rlYzq8h$K;X}=5m+8CYpJ4Yw6zLi%S zpu}dkAc_hVv>NfWy9eLsQ-6OzoBl{WAkRi|U;anmJ5dFwz(C9~-A(!Vfw z(E!S5ua;@}(q5GrIc6|PAOSPg{il$s$UBI}tk5xuP-VedGyZd}xqXvWvU_`{;Cf0> z5fN79T(#iq-q$RLb(of0ZA0lfepj^!a2-6 zv{v^7r2J*xmj&XVgZ>Wd=RqwGGe1`-Svll~bz(-y7*N1ooU5J*aY@&5ea5ss6n(a? z`N9l?w~=^1g2wLDVRD5ovqLc^Z#YRDFR+QYV4emH*fzOpzer3>Pudh??f``be>dD3 z)xB}1O6bZpnt=j(m92Fxq0dz89n>B05xx10QDL-YDz&e>h_u@9+RG)Pv4{2IYNiMy z8auH}j+fW*;q%Ymtbq+KI_r4gxGUeYJ>hq~vbe!N3%NntH+Dyh7I70!cu(qE_`Vp; z07NvH4Q2s#9;mKj;>umoviK|H+#CbgGq`D+QxI*$r6&D`yf%-M^{H;6gi4*j3?c9c z8$}NK?0I4%b?c`p2;SvL3*xY`0fe_KIZqPm`M%{DCrPUt{bS|zlhbHBNlUe7zcK}E z$L2zIl+z#Z!thJW!}{G&JAC@Pg`H(}GLM_m;uV}C9Yt(vF+F0Dy7{`k zY&v=ZZf?8^qSD>~2iP#{qQK632aMplZye6Q3X>dctS@JHSz2)zJaqXvFEZlr>9$oY z^&9^4pN`1EJcEw_wi@P{zJqQX470?WZTB*5Y7F!3#xJO^z|Gw@)bFoY5#daTP5OgI zcbKI$Ok(|9g_%#If*$3ga=U0_n%|#}eWwyeW~(19Te+!xF*(rd=LU(nM15;<7Z&oA zrqIw#r7}&_qgCdvS7+!|3?8w7JNRtHQ$~8Yyw(xC+n=- z7SQBo3+)tbg2NJn^=lukNOCkiEsgt~4tCrZ{aSnrHRMk@_?1^whFrEn3mT1NSC9B&c-(JrWu@FUhSNf+(>-_%kX#@LYnzq`^M#XX}(*!_LZCY za24(5Y$WH^=;GY^#0c{Y4{_!GPvm_bd#&6ypUpfwu%|+=UEe^Q+oe$7cXnyF@O67L3%SKO#rdayD^4^vH2hG{w%vp|_*jKf4 z=jb?40UP4S+Mi~(Uz(^cvgVB+r+Rt|;wnFRYcz(i=&Q14Ok=V-tTPw4%v&;ZrxI#w z6&rvLjj#yzBr5~N*7o09CkIE=>EWwo`ceL*@Y=504RB*xY#SY{)p3Gvn9zBL_FCN0 zl^axu8p~su8HpiDNi{%5ojAv1{0?t7*mflF9&Y_x4#)X(jyLl~c+s6*I1G7{zBI;tH*_ z94)o##4$cU4ohj~e#C^E><)3E`d;ftdwTQZpDmp)9)n5^+h%BE?)8LI2A`L!zjTBL zPYE&+#0&jDFc&4Tg}VC}E@4ZGyWbiK2dvn6Mpu!cQT_^6!RG!7)fE>V>?PNFm?vc5 z>A8gcW=5Xm2#LEW_;XgMQ$=Y-#lc|zs2}}2ny_4Kb%D@Vrtu6rOmUe!ph7;;L`XHi zXcDHc;OYbIk44?|A9-=Ml{Xap)^{jb5$Kl?v`CIT`bDXV*x{h+UARtzOd}#US>a%X zOdU`5^_P@lkQxB*B<&RQB?FgJOH2-~rMnXf_{5%~s&OlUM^i30FeOM{`XOXs)3_BU zEAyNr%bz8RJ=Cvw8y=)3p z`K|i!j$l~LqQ)kabHK}7WeyB$x*({t#cQWf98qh&X{R*Y--9)~g)?XCL>&z;v9#hY zTFY?DV&1fPE&*z}6Ki`Y5#(-eVYB;OzZjPSDnN%ArA8D>wODpQT4Jt}ah556JE+G_! z_P0uQ!qDhR94VdpAqajIOl4~>oTaQ8H5yXaTZUOb%cRAkWYV?KSNlTqgSM=Wgf)JP zz=?Q5f5zPEVO!NbOCbqEwP^Ff_O_`gdm67#U{Mp^_bKcq2IoO%zcJb(M5z`cjv1Ck z+!awNRhwjj6CQqu+xC#{UWo^3+h?6ymzq3r?3JV}<|u_9x=MWAm`1AqAnOsJ*@)^4 zr|`FkZlg{Cd!#Chmhn=_ZQe;~-DTUOv>)Tbmh0{z_42vWa|vNUO% z_5KA1xNHBgw0zjUH|s5xg$b4k z@Koa#-AFizrr6h2#$k*41tm7_jp$yL4X*DZcklq!u+>9E0WnhcOFPn7Vh^ao@~tno z@RwY)*+8&|Hpdq)`a=L*Teuw;_B@u;o!a!YaOO@bs-?*gqpm?nRkXl~mKFfF z+OVzE%RlC`M5-+KM_GXZ@9b;=2C(sq+R&Ko_RzZ%5P~kDieK3yzV4BN*{$E%KY;4k z)s?*vacHYN~u+?SoI`e@S2!9Co!cdvz;@N@{yj`0-9^8osR(V7PR-O&gM)x3owqs5oJpIwc zgY`#VzjI$V>YYDrIr8D;0JK<10@ycefw z;;oV(!gUR*xBg%xTl-#d>u(5}#jFrLKo}q0b{IuuZhuO7n++ zo@9)d#`(AT$mbW5g;c;&z>1_2Nk%;L?TIhfeK%PYp>5N<5wdihxw4-qvVsN6t@bol zDFgi~t`B&ZU3ek!#fXVE5Ao$7AwI+@amT_m2SclwQE{cLcv3kwhokq+!S%>Fe_*(Z z75)vhq@YqZqa~Hf$0S?T@nr_%mV%*aT${~4)6|(P@Bq_Q!VC4tZa`7?ra`4?oV+wSr2`TVSUmKS_>V@3%0*S#!+L=3f@oF=4k9U9xv0p1;Fx&}V;X2J~h zcz^}G3|;s8JyEFR*LB*fPUm+?f+ofnBQ5uK%NrwA+RV_~h<6-mw_wU?NGRI!zNTh% z&>ty6x8&gW75gdW)?p->&%?{*brS|k@b|(>&<^nyO55Pi_q*eK)=J*Uunw2cw--p%E!VXuDa? ztZ$HPKJ6$Sh7!UrpxVBLFSnpZOw$(ftvg!Nk1LVfL+FL(u zh1Abu(oCSmgqQ2IrE;Zz2f2DAD%T4XO6tU&)2IB}vV3{^xpz1MYFEPy_09RP2QvmA zIqw<(UaCnCs!mFX$+3sjnV*(O5)y`jW!*wzF-l^K`Bxgap+0Ej z@c^nf{Ic`6I5#9bcE7fwiiP8JZ9dr3FsD~SBiW_`8{UgFt*{$@qj#E)90JYra>Zs3 z$sCTuzOye2GdTO;4@;wgJK@!ij-|c--insluCR}{#q=D6Xz#nL6;`rkc*UzLTR%Y{ zN2YK;Zcz4YY=+|(0_?E=#~3U@I1fIyRiBF zIeWj=id+b|L;kSMs>NMfeB^(={IdrC;NYJy_$L+olL`OdOqgH0OpSa?FTRhwb<|%A Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Info.plist b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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:example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/.gitignore b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/Runner.rc b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/main.cpp b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/resource.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.cpp b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.h b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/main.cc b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.cc b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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? zgxkP+ytd)OMWe7QvTf8yj4;V=?m172!BEt@6*TPUT4m3)yir}esnIodFGatGnsSfJ z**;;yw=1VCb2J|A7cBz-F5QFOQh2JDQFLarE>;4ZMzQ$s^)fOscIVv2-o{?ct3~Zv zy{0zU>3`+-PluS|ADraI9n~=3#Tvfx{pDr^5i$^-h5tL*CV@AeQFLxv4Y<$xI{9y< zZ}li*WIQ+XS!IK;?IVD0)C?pNBA(DMxqozMy1L#j+ba1Cd+2w&{^d-OEWSSHmNH>9 z%1Ldo(}5*>a8rjQF&@%Ka`-M|HM+m<^E#bJtVg&YM}uMb7UVJ|OVQI-zt-*BqQ zG&mq`Bn7EY;;+b%Obs9i{gC^%>kUz`{Qnc=ps7ra_UxEP$!?f&|5fHnU(rr?7?)D z$3m9e{&;Zu6yfa1ixTr;80IP7KLgkKCbgv1%f_weZK6b7tY+AS%fyjf6dR(wQa9TD zYG9`#!N4DqpMim|{uViKVf0B+Vmsr7p)Y+;*T~-2HFr!IOedrpiXXz+BDppd5BTf3 ztsg4U?0wR?9@~`iV*nwGmtYFGnq`X< zf?G%=o!t50?gk^qN#J(~!sxi=_yeg?Vio04*w<2iBT+NYX>V#CFuQGLsX^u8dPIkP zPraQK?ro`rqA4t7yUbGYk;pw6Z})Bv=!l-a5^R5Ra^TjoXI?=Qdup)rtyhwo<(c9_ zF>6P%-6Aqxb8gf?wY1z!4*hagIch)&A4treifFk=E9v@kRXyMm?V*~^LEu%Y%0u(| z52VvVF?P^D<|fG)_au(!iqo~1<5eF$Sc5?)*$4P3MAlSircZ|F+9T66-$)0VUD6>e zl2zlSl_QQ?>ULUA~H?QbWazYeh61%B!!u;c(cs`;J|l z=7?q+vo^T#kzddr>C;VZ5h*;De8^F2y{iA#9|(|5@zYh4^FZ-3r)xej=GghMN3K2Y z=(xE`TM%V8UHc4`6Cdhz4%i0OY^%DSguLUXQ?Y3LP+5x3jyN)-UDVhEC}AI5wImt; zHY|*=UW}^bS3va-@L$-fJz2P2LbCl)XybkY)p%2MjPJd-FzkdyWW~NBC@NlPJkz{v z+6k6#nif`E>>KCGaP34oY*c#nBFm#G8a0^px1S6mm6Cs+d}E8{J;DX=NEHb|{fZm0 z@Ors@ebTgbf^Jg&DzVS|h&Or)56$+;%&sh0)`&6VkS@QxQ=#6WxF5g+FWSr7Lp9uF zV#rc`yLe?f*u6oZoi3WpOkKFf^>lHb2GC6t!)dyGaQbK7&BNZ7oyP)hUX1Y(LdW-I z6LI2$i%+g!zsjT(5l}5ROLb)8`9kkldbklcq6tfLSrAyh#s(C1U2Sz9`h3#T9eX#Hryi1AU^!uv*&6I~qdM_B7-@`~8#O^jN&t7+S zTKI6;T$1@`Kky-;;$rU1*TdY;cUyg$JXalGc&3-Rh zJ&7kx=}~4lEx*%NUJA??g8eIeavDIDC7hTvojgRIT$=MlpU}ff0BTTTvjsZ0=wR)8 z?{xmc((XLburb0!&SA&fc%%46KU0e&QkA%_?9ZrZU%9Wt{*5DCUbqIBR%T#Ksp?)3 z%qL(XlnM!>F!=q@jE>x_P?EU=J!{G!BQq3k#mvFR%lJO2EU2M8egD?0r!2s*lL2Y} zdrmy`XvEarM&qTUz4c@>Zn}39Xi2h?n#)r3C4wosel_RUiL8$t;FSuga{9}-%FuOU z!R9L$Q!njtyY!^070-)|#E8My)w*~4k#hi%Y77)c5zfs6o(0zaj~nla0Vt&7bUqfD zrZmH~A50GOvk73qiyfXX6R9x3Qh)K=>#g^^D65<$5wbZjtrtWxfG4w1f<2CzsKj@e zvdsQ$$f6N=-%GJk~N7G(+-29R)Cbz8SIn_u|(VYVSAnlWZhPp8z6qm5=hvS$Y zULkbE?8HQ}vkwD!V*wW7BDBOGc|75qLVkyIWo~3<#nAT6?H_YSsvS+%l_X$}aUj7o z>A9&3f2i-`__#MiM#|ORNbK!HZ|N&jKNL<-pFkqAwuMJi=(jlv5zAN6EW`ex#;d^Z z<;gldpFcVD&mpfJ1d7><79BnCn~z8U*4qo0-{i@1$CCaw+<$T{29l1S2A|8n9ccx0!1Pyf;)aGWQ15lwEEyU35_Y zQS8y~9j9ZiByE-#BV7eknm>ba75<_d1^*% zB_xp#q`bpV1f9o6C(vbhN((A-K+f#~3EJtjWVhRm+g$1$f2scX!eZkfa%EIZd2ZVG z6sbBo@~`iwZQC4rH9w84rlHjd!|fHc9~12Il&?-FldyN50A`jzt~?_4`OWmc$qkgI zD_@7^L@cwg4WdL(sWrBYmkH;OjZGE^0*^iWZM3HBfYNw(hxh5>k@MH>AerLNqUg*Og9LiYmTgPw zX9IiqU)s?_obULF(#f~YeK#6P>;21x+cJ$KTL}|$xeG?i`zO;dAk0{Uj6GhT-p-=f zP2NJUcRJ{fZy=bbsN1Jk3q}(!&|Fkt_~GYdcBd7^JIt)Q!!7L8`3@so@|GM9b(D$+ zlD&69JhPnT>;xlr(W#x`JJvf*DPX(4^OQ%1{t@)Lkw5nc5zLVmRt|s+v zn(25v*1Z(c8RP@=3l_c6j{{=M$=*aO^ zPMUbbEKO7m2Q$4Xn>GIdwm#P_P4`or_w0+J+joK&qIP#uEiCo&RdOaP_7Z;PvfMh@ zsXUTn>ppdoEINmmq5T1BO&57*?QNLolW-8iz-jv7VAIgoV&o<<-vbD)--SD%FFOLd z>T$u+V>)4Dl6?A24xd1vgm}MovrQjf-@YH7cIk6tP^eq-xYFymnoSxcw}{lsbCP1g zE_sX|c_nq(+INR3iq+Oj^TwkjhbdOo}FmpPS2*#NGxNgl98|H0M*lu)Cu0TrA|*t=i`KIqoUl(Q7jN zb6!H-rO*!&_>-t)vG5jG>WR6z#O9O&IvA-4ho9g;as~hSnt!oF5 z6w(4pxz|WpO?HO<>sC_OB4MW)l`-E9DZJ$!=ytzO}fWXwnP>`8yWm5tYw`b1KDdg zp@oD;g===H+sj+^v6DCpEu7R?fh7>@pz>f74V5&#PvBN+95?28`mIdGR@f*L@j2%% z%;Rz5R>l#1U zYCS_5_)zUjgq#0SdO#)xEfYJ)JrHLXfe8^GK3F*CA(Y)jsSPJ{j&Ae!SeWN%Ev727 zxdd3Y0n^OBOtBSKdglEBL)i5=NdKfqK=1n~6LX`ja;#Tr!II$AAH{Z#sp%`rwNGT5 zvHT%(LJB+kD{5N}7c_Rk6}@tikIeq%@MqxX%$P!(238YD(H<_d;xxo*oMiv^1io>g zt5z&6`}cjci90q2r0hutQXr!UA~|4e*u=k81D(Cp7n{4LVCa+u0%-8Uha+sqI#Om~ z!&)KN(#Zone^~&@Ja{|l?X64Dxk)q>tLRv{=0|t$`Kdaj z#{AJr>{_BtpS|XEgTVJ4WMvBRk-(mk@ZYGdY1VwI z81;z(MBGV|2j*Cj%dvl8?b2{{B#e0B7&7wfv+>g`R2^Ai5C_WUx|CnTrHm+RFGXrt zs<~zBtk@?Niu%|o6IEL+y60Q>zJlv``ePCa07C%*O~lj?74|}&A0!uA)3V7ST8b_- z6CBP1;x+S@xTzgOY2#s%@=bhZ@i@BwmS)neQG&=9KUtRf^K=MvjC5JnqLqykCE_P0 zjf#V4SdH2#%2EuDb!>FLHK7j;nd6VLW|$3gJuegpEl3DZ`BpJU$<}}A(rW?<6OB@9 zKP9G3An?T5BztrLdlximA;{>Tr7GAeSU=^<*y;%RHj+7;v+tonyh(8d;Izn}2{oz& zW)fsZ9gHYpI?B|uekS3zHUue3mI zb7?0+&Zm>Kq(F>~%VYEn)0b32I3~O^?Wx-HI|Zu?1-OA2yfyJ;gWygLOeU;)vRm3u z5J4vDIQYztnEm=QauX2(WJO{yzI0HUFl+oO&isMf!Yh2pu@p}65)|0EdWRbg(@J6qo5_Els>#|_2a1p0&y&UP z8x#Z69q=d663NPPi>DHx3|QhJl5Ka$Cfqbvl*oRLYYXiH>g8*vriy!0XgmT~&jh3l z+!|~l=oCj<*PD>1EY*#+^a{rVk3T(66rJ^DxGt|~XTNnJf$vix1v1qdYu+d@Jn~bh z!7`a`y+IEcS#O*fSzA;I`e_T~XYzpW7alC%&?1nr);tSkNwO&J`JnX+7X1Q8fRh_d zx%)Xh_YjI3hwTCmGUeq_Z@H#ovkk_b(`osa$`aNmt`9A#t&<^jvuf z1E1DrW(%7PpAOQGwURz@luEW9-)L!`Jy*aC*4mcD?Si~mb=3Kn#M#1il9%`C0wkZ` zbpJ-qEPaOE5Y5iv_z%Wr{y4jh#U+o^KtP{pPCq-Qf&!=Uu)cEE(Iu9`uT#oHwHj+w z_R=kr7vmr~{^5sxXkj|WzNhAlXkW^oB4V)BZ{({~4ylOcM#O>DR)ZhD;RWwmf|(}y zDn)>%iwCE=*82>zP0db>I4jN#uxcYWod+<;#RtdMGPDpQW;riE;3cu``1toL|FaWa zK)MVA%ogXt3q55(Q&q+sjOG`?h=UJE9P;8i#gI*#f}@JbV(DuGEkee;La*9{p&Z?;~lE!&-kUFCtoDHY*MS zzj+S$L9+aTs(F^4ufZe6>SBg;m@>0&+kEZMFmD*~p~sx?rx=!>Ge;KYw<33y#*&77 zFZI`YE(Iz?+tH;Fq;y=MaSqT{Ayh*HFv0(z{_?Q+7@nE%p?S8%X6c!+y;!0NLXwJV8Co_}R3*7>n+oMsQpv8}8ZS-P@(Rg|gmxZHzf=nMOUAAY}AZGfWVzZjE@4$=7xkIrs8BE%606aVU%kxz_04ipig51k& z(>c9rJL2q%xvU%Zj#GR9C9)HLCR;#zQBB@x;e_9$ayn(JmSg_*0G?+wOF?&iu@}S{ zt$;TPf*Lj$3=d<}Q3o!Hq@3~lFxoiCyeEt}o3fihIn{x2s1)e2@3##&GYDq~YO|!q zUs0P-zy)+ohl-VQ`bhvUpC{-d$lkpML_M%Kl6@#_@A}w{jWCDsPa#cSbWA#C4Sf|*C*&Z{ zz?hOU7Cc`?>H$WGqITA2P~fYudnQHxB8^;0ZFKC;19F#~n_2P@{cE{Czq-#K5L_8| zc3aOEwq4%zL5>YU_mc9fc-p~{fBTWUkxTiZvxt9FOqC{s#TBp(#dWc+{Ee{dZ#B!g zHnaOJ8;KO1G;QU2ciodE+#Z$Wuz*Hc6NRO!AUMi|gov=>=cwcZeL&`>Jfn!35hV1J z;B2@0!bIR853w%T*m6)gQ?DPnQ)o6EtKaN3L;o?*q<83d&lG&U=A|6hcT?f0)4h6{ zGIZ0|!}-?*n{zr}-}cC}qWxEN%g60+{my)o^57{QEn(tSrmD7o)|r0+HVpQPopFu; z0<S}pW8W2vXzSxEqGD+qePj^x?R$e2LO&*ewsLo{+_Z)Wl|Z1K47j zsKoNRlX)h2z^ls_>IZ0!2X5t&irUs%RAO$Dr>0o$-D+$!Kb9puSgpoWza1jnX6(eG zTg-U z6|kf1atI!_>#@|=d01Ro@Rg)BD?mY3XBsG7U9%lmq>4;Gf&2k3_oyEOdEN&X6Hl5K zCz^hyt67G;IE&@w1n~%ji_{sob_ssP#Ke|qd!Xx?J&+|2K=^`WfwZ-zt|sklFouxC zXZeDgluD2a?Zd3e{MtE$gQfAY9eO@KLX;@8N`(?1-m`?AWp!a8bA%UN>QTntIcJX zvbY+C-GD&F?>E?jo$xhyKa@ps9$Dnwq>&)GB=W~2V3m)k;GNR$JoPRk%#f3#hgVdZ zhW3?cSQ*((Fog26jiEeNvum-6ID-fbfJ?q1ZU#)dgnJ^FCm`+sdP?g;d4VD$3XKx{ zs|Y4ePJp|93fpu)RL+#lIN9Ormd;<_5|oN!k5CENnpO>{60X;DN>vgHCX$QZYtgrj z*1{bEA1LKi8#U%oa!4W-4G+458~`5O4S1&tuyv>%H9DjLip7cC~RRS@HvdJ<|c z$TxEL=)r)XTfTgVxaG!gtZhLL`$#=gz1X=j|I@n~eHDUCW39r=o_ml@B z0cDx$5;3OA2l)&41kiKY^z7sO_U%1=)Ka4gV(P#(<^ z_zhThw=}tRG|2|1m4EP|p{Swfq#eNzDdi&QcVWwP+7920UQB*DpO0(tZHvLVMIGJl zdZ5;2J%a!N1lzxFwAkq05DPUg2*6SxcLRsSNI6dLiK0&JRuYAqwL}Z!YVJ$?mdnDF z82)J_t=jbY&le6Hq$Qs}@AOZGpB1}$Ah#i;&SzD1QQNwi6&1ddUf7UG0*@kX?E zDCbHypPZ9+H~KnDwBeOXZ-W-Y80wpoGB*A) z_;26Z`#s0tKrf~QBi2rl2=>;CS1w)rcD3-sB!8NI*1iQo59PJ>OLnqeV4iK7`RBi^ zFW{*6;nlD&cSunmU3v4JKj|K4xeN(q>H%;SsY8yDdw5BJ75q8>Ov)&D5OPZ`XiRHl z;)mAA0Woy6f!xCK(9H2rq?qzp83liZAIpBPl-dQ&$2=&H?Im~%g;vnIw1I+8q|kr! z36&^9}CMmR(U2rf|j12oG=vb%Ypsq8u9Kq}U*ANX*)9uK}fAi8;V_7Z;0_4*iydDxN-? zv?qJ=T*{MzL~-xUv{_Kh_q9#F{8gPV!yPUUS8pEq*=}2-#1d=sC_|U-rX~F0 zBLawgCWy#?#ax{~DAnDvh^`}wyUO`ioMK~jgh%L7^}#h?beSyvQ_g>+`2`}`-1h7# zg*?qJdm=53hwN8~B=^|LPmYtOVrQ(W{sNm4uofq=4P@dUA%$onWbw_m-KWia&n9iv zi)!9#OJ#^}eg8tE{wSb9(c0D^PS1 z9EBS5*ypSiVRS_G0v?$hyoZOS7hFWlp4qbYkf9Y&{%OzhsIdHskLptn96@k6@^K@U zszd8POehITDK+AyW#JKpnWY;ju#MC$JjB1Y*~(E6N%{p#kO+bVxG3X<34n3fW=k{A zCZt|KP%x^GQ9%mU)KE0{LA=vaZvRQbxSlK~eAkwWo2Z<{j5eS5NVTMe`m%re8%~7K zZLtU&b~YDN%~uA9wPf>x2=PI=MA6_oVe>Ek$s5&&Z=8vvF5EODP4Av(b|dlNgF1O8 zy83W0WRdzjz2iNA~t1piEqlyU&`$yZtqR`6X_PmuP>W+D|8iH;FQ zN{JuU#Tz9mV=4R_IewROL1|mK^`lLat#LcIBfggzM(iO$pQT*-c_ z94^LUWw#5B9~sp2W1p`c)Y(xfR<{O^9n4E6vDDw{#-R4UMBKo{>Hqlqn*a9rl_>+0 zS5MwJC~nCC`1X%VCyWFsiDX;bfAJQAUkU#105f_s5U-8rqO}n8fA1{b>Fr6Q|Ea(V z5B11Lo^ooWF?`^{-U#?iatokWI-e$632frzY?Yzzx(xJc@LFM4A~-eg!u|tl{)8Nx ztZLXsSC*68g%9TFu(f&J9nmc^9hgyy#uUOMJFCaifSaDcyQ&6=8e9=t zIFEAQ{EK{|73{($!a4=!wj4ABcQrUQp#+gGM?wEUp(w@+Fzi{!lt}|3`PM%&d-seeR zB$}BrFGD3R10CE>Hsb>;PrP}pd` zaY4}6+Wu(`#uAV+E5SV7VIT7ES#b(U0%%DgN1}USJH>)mm;CHPv>}B18&0F~Kj@1= z&^Jyo+z-E)GRT4U*7$8wJO1OibWg0Jw>C$%Ge|=YwV@Y1(4fR>cV#6aGtRoF@I`*w_V4;)V231NzNqb6g@jdpjmjv*<2j02yU$F8ZS$fTvCC`%|Yn#x< zXUnP&b!GLpOY-TY3d?<-Hhxom_LM9`JC9LEX2{t1P-Nj%nG+0Vq)vQwvO^}coPH-> zAo8w#s>Je^Yy*#PlK=XDxpVS~pFe-j#jN-(As&LRewOf(kN-aKF(H+s*{*!0xrlZw zchJu@XAvQWX7DI1E8?F}Wc8m46eT+C<0eXVB+Z^(g=Kl@FG-cn@u$suj)1V2(KNg_ zh29ws6&6(q~+sOAoHY^o86A<#n*?Pg2)cK$+y;cY$hJLq4)4V84=j+3ShSr##Tk5kgmxB zkW+8A1GtceEx~^Ebhwm36U?oA)h)!mt=eg0QE$D1QsLNZ_T3NH?=B&0j~#298!6iv zhc0|-{46*3`Rx&nKSXnf1&w-Rs>#PGAGuY@cBTU-j|Fxbn3z49S#6KBaP^Lx*AOXxIibr z!1ysMi(&kr!1wwQB5w`BDH2~>T4bI`T1}A2RM0zd7ikC&kuBRsB`Z2@J!Udm{AmSN zrr0k6_qCZL**=)xRW`MFu(OY=OT;3G8eF~ z2mmkXZ9X(sjuKmq+_<=LSjphB$~R1o^Yb=rO!j!(4ErIox^x55o{pXSE9X$!76^*$ zoKhlAX6y%n^U=C~@!vIlEgXQGD@>oOU=_(aXF-Sjas*$AKESfRzxQ8#3yOj|y0OCU z>6Z-0%LCcjla&7I+CXm&caKp@@jQ!5M`(_{CL=@4#JJ}cHeZw>^b6fpv269LSV?gV5Q{kk?4;;y9RIsy5vk%DIRiL(9xe1aA@4!VX zDh2}xgUd5X?6nji%&7-%QuyKSYA-Z{PwJijUQ}In+EJl|x@dF1P<5bPa5W3&&?^h$ zZCo8LepKo0a(Fsln*cHL;D(gu9MMkoiM0*n31u)jHqX5x^F95tnI&^}^yKx3YwEm@ zo8?EZ710ykx@19{=yz5IXb8w4yjdveWb{IVL6Z(Cs>!a_0X^1E27o!4e&b43+J*u2Gb(59k2uK0goLwhO{ujLS ziI9LA9`&x~Y$6JNX!aEXR``}LUI}Gr#=<^wBHmg%v<)zRWDVtq)kT$-P7iU1R)2XZ zi~bYhV@EZ`@prgK(cs{>2jn$pxg$<|KjJ7%26Km>%KcXh^bU@y@V_Lf@=j1x%R4{v zOcQn{I}!2W<~08FOVnoV>zOTH=+>v9!jFo|q)ucqIe!N4{U5_G`>>*sVD{8I~4FqyU8imZ**-Gy`~Xd z4w35GMf%7^i65HdX{Iz|f2Kg193#KhPIeR)-=eYx3Z!%RM=JjwLrdk^B#6rg!ym2w zPbFqYyO4>W_Z6PonAwiu7?!h=x%sR-T+_*xZOGh2wWhWr%}%2^$$ zQvACIB~pi=m|`hXIMvoq`TOCx=J_D2>pi6$NPy3&8#vy|oX)=kM0Z}$BR$r0G}MzOk-OqG+VmZtOZoj6x4(tLh|5h) zBv64Y{DPHsy&_H(5_l(&Y}FhVvr9m_*_Q~Zy-}V9+VmGnvndEjYW4qt4K~N&Y&6g| zfpz*V=A#^mVmuOAz)(KVI<%v5NY0%Goy!{9&o41upsPWk(yFuRP|A4q6NMnX%V~MT zi_Rb-Bno2kI+j0Cw`@ydy{e%ARS#Z%b6I%_yfo_ZKXr4BLVoHzBKJ^ZG z-2>2IzU)55@9C|?_P$ew^-7zEiAKG1XAi{!3h%1m#9s%^pGy6S9wKFYY4<$djeoJP z{GI}Vd%idY$4_fh(7NXm7#;cC!DS&-{tGr!Qze{^%bUx2jgG@-kMta^q-EwrKB}d8 z{%FT>rFk_bzW<{lc%eYlrsiYTZXGgzD1&lmRyp+c1O=0=zAX=KV62bx-a~JP{cPF4 zU$-XT#(9&T>l@bMu3nSr{)%-5lV+0t&bxip4DVJ~vlL$J2P6X~ zd{FS8vm{Lhrieul*7&(AgPuXhjpGila%6_?-+k#b)cdk#M1jB*nE>G6NGOr+Ek{`= z9b%S1`$`=g0CC$>0$Db;l_szReLYVmce*(()9%Zz1`*fNXhI*oRlerWHarD(v^W^c zuc1Vuw6Gbp7ZsoRH>QGt#&lv;5G~Ovt$%7VFd*-rN2>UjbOWBFGNGO`bru7CFB4tn zL`^?69Lj_g_TA&`9`dSI8s|)K|QM0 zybvV7!>xDY|6c6y;Q}qs`){1+WQu_5Dgd8Qe|q}}bxjH+joQQtqs1IVZn6{e7T{ia zF|=^xa%eWO%(x<7j*QZbcU_;aVaVP!arexOLOtoSNt*hvsRL%}%)jPetSich(`b-^ zMZ$PM9%s@%*jPVz0Z^W*cK_>G4f}+eEVX`HOaHg#!B`<4v;x}zDLMR*M27`kNfp!! zOfdt(>k-g>7jf^{Se@3$8<+;R*cYtw+wD_Z8Pl~!JDCUEPq{Ea*!J9`%ihyNJZ30i zmfve}S5<$Uso}_?SuI$ks|{-ddGLu9WR9`^9)Kdi@Vs;x#SY-xp}wHPU0|vEA7234 z@BN1z7OF=OOQtPF$4twn3!HTVlUVD_)ubMM7PEPoiC6lQgL2q9PK4~e8v-OuH%lie z?NgBLkIdPMG$QBq(>r^AOHB`|*1#*!2Z? zuU8H|FD`OBRu^(R?Z-Vhr0j;FLpS~a34KREnd}B=EYHS*>Hm+f%tgJt!4J8Q`qn^4 z9F=tO#JRJ}tzA`vx$nZ)O%wC?Uiv0+_nz}5Lj4ki*&=K&*#U`=rv z`Q@Q{+IhAj@6lrNK2B=8Yln!O2%zomfRehFT~;!O@(@Xy|1Jlw*uOB-M$#6K^)QBm z_7%#QVUDPwnW{iOV-grMQQU|3{=BQMh}c5(yMGdoQf*)k9-B zMQ(^GdJh+y)>qJprknS!%WxqM>HlHOP#7UVdy>%PW$!l72J`n-p7j(DBKoGxXWh(Y z>BFDZl|7knU_jg_SSbvFk8)39%2)Hu5W0}HKlh>EaqvFoXI&56Yy)3) zQkE4X^P0QnPn?iUUVHJZXzPp`s5uv?pG{K9IgGoHvcmlBxubi|iF7n{)mhenIcxGs zgr0OpQy#Y#u=5lOyiECfE_Sn?Fj1LyoRKcbTgX{p<T*v!CGkPc)pcA2D=4Ekp0Gb*wpy7S88C%Ywsbr?MI(3UdsCM?XJ1X%*hNjB)XqZ*W(qDdtSb z<3XN74ARXL3=c^bfW~F%NM^5*Zx92>Wq`&M625p~j$8mYwLbk%Kf)jbn#<2z$%vP5 zy#b>-tF-S2_AB4;R^K&^-1LJrUmi@9rB^FLF)-k&YHK8P+k@RCJ1qSTZ@=kHxA3l$ zmK_ZG)l6(nmCR1a8|;QF-B5e_ELnjJ1$m-;4UXX?WytF_wz7#&AjwZYTMVieLbq@R z3t-q|G4^BB#EpNu4uyfDebB+-uu_$9>y-dzB30Y9F=R zrW-Heqnj*InPTWHgR9v^R7~hokldh&h8=HDhMW(EFfim1*{)5Lc1-+eBVkK-2!u=N zuZKABgJs3I--NbjE;>Undg6uK`^U>AQ6V zhc!RhYgvrmeGNsftr+(C<_MtuV$`5RZTf#5r=DR?gWG->#})#=(td%C3`oO+2B7im zUqY}&a_QNTn?s+?=mNXiREN%x_=(H)L|DtYPY>SR3pQfBOel7G_jR_{!9`dSj8Up-`JgcB;=Oor)U=_EVjF3C5{Sqh8cq=~bRjoBpoc$kJCgtTyZGSpQ4= zYi$6b$-dGmuTDF&@amhV?cU05g(AZV&v2$4m&j_~GZk;&keSO(@LRESRZ&p`dV*6w z2$em~p*8yM6j;SYorw`M5K2mluJq7P5Yn$VtZj8DEs2Zk=O@4T&Q}>~f31Z{uk}`E z{Dp{KObh1kk~~MfLUod72{Pk6G@T$_0_N??lOrdR=Z;VV#m0l)&@hz{Z?)@sgImi-&i1@95g53rON83v!yVPDHRU*Mzc4yZ(-Fr z{8{WXmIJf7jeswk$;6s~Qac6QyM3W&`}m#gRt=rr95A+Ad&wSAgvXZ|F))rBJVJ5W1CsjN`QaOzct2ocq#0!v zmj#075)C!3oS>&N;aHS@<+c>RHL)8j^p)k(8#7$LEx!1g_1^02!4_qA=;uhKW=+ix zGX%+vBMiRiF^^jm{mdO(?GdWJ#unO#_F^7mhT8)s(z_WlwFyJ#Xh)k5+RG2f;LC*K**1dr`#}~6A=0B=I&V;%zDA1)d@G!X#Rng)7G*2k8Kg447r0ox> z5NK`d(H-afBwo9feDOUi>;BbPsu!2|=@g=3j*PY}@YrOb+SX6?#Yb2xaaK!?>SX1J z_!VsB`2n1=wwSftkydm!39|-1?c%Epx?TO<(#GO~I&{f4+)XwRk<7RQ1~5>QcKH|D z?!}j1ueO0Lk;FZ{k4FA_(S`Ot0w~tl&m0duID*f6RY#bkw||o;kZ# zISYNTb|{~|X$m$Q-Jv#uxyw)eM0gIv`V#wOAp&Vv@>X4_tSZ&L#juM@$S9 zx_X_tLh<_^-F;LAQ09s@sPb%PMTrcw*HUV0P=RYSlM&AXEOI&&R&YCm_S<7DRBx^L zA^R^iwW+LMk(r*$Pq-fKU5X@=mQ=`ErO30H@@&qqnI7zJcrbSh+H<V ze&7Uli0xj@WrW#&-9%*FP~kPYF_YYM_hs5~|ExMynQ%qvq`leRB6W0yhC@pCb8>_P zlf=F~WMv_u*-DV=UaVu#2rlzK{q8D95VwZrfV?gj@rSNWXFvktUq)V5+YrlxwX302ae(;aG4e>L-M@3J+-f3IT{b9l!kg*2M zC1+ND9}6m^()LE87Mt+^Q|)!y#suc&v26C=0W88%a{?)E8Yvo@kM&KNMaOst#|-_CbUTm}WS@-c>nRb;&z^ zYr)+IE$1=jov(CZ%3uR+`~NI>1&Gs6W(jaamjcN$a`2!*nO}l|b%?)Q%%UWzw>A`C zR@px(P*7j$TK?jbv*%x)e^|jcLsv}aF(Z0=7(%Oa7+1wY>{B>d+i&ZA$}k(qgZPZY z;VkW~8eWnU&HPIAbco?&tc2O1$6=7n{u|^Y*nXoac{o1W-6aXfy~KlNbJfLoq~6;+ zDYmnv--Fhqrl+UV#k@_(1=gWNtqhyVKN=9CZ-{Ohi>e=~bm4IKbhM%%W zW8oXE!rGpV7Wt(_^4nndH1_imheaWzDi|I})9ZVZ9>pN+P%dVc5wG`Ze*4`@rjn1^ z`ln(;vPBHQUb}y8S>=8q__r7g+=z$>!pReVB0@XKchAvyGjLQs-u>+w%`frV4FeIG zj=7n~hGrwx*&5aHy(7X$bDZ7YhcP%(*>G^lAYMK;qG~V8Jz@b7oNg;IA1z$9@TbzW z;@I51@Ekef#qbxnG$Y8Z%bm~ibZ=4#%yKr%#b)CDrfKN`ujIY?tA4h9)i~dZ4E;ZM znvb$n2)zn$Wx&zlW%mJZDh28ox$@%`w3i7YFepXUChw}$UXKI=-TM51`M#FH=tdr*mQ!c=aB1296Lu>iTTKZWss0f z5~ihdImPN$aTle_AdbYC^31}_^EK|9R&l#%3hbx;8vJ+Gp^tm{9JDILu*1PW!rh^Dn9p<)h#Sl4kKM%nm<+!ESSk* zC;lLNT$fgr-!+{aBsSx$41b}yy6o>r3F#1&iv3cfY2N<+`0qJ+>=&Qxs}JOEkD?^l-F5i`t5+zNuvJf z3Fh4$mNqiFXL-aq4U4K@Ae$fq-TDT`rvrx;gqx96w^*@s=mcthCaIyPe(w)6kI{EqV10tcShHU9eeAPs)s?6#vrq}>y3FeTJu$Udha+z zs7}rmA@yR(L&>35sNjQqrw}o^)UitMU!5g6nnG)(tgst!^`FKJEzI1(d@j_w@;^hr zgYxlIRYjho4U$bhczfq&YySCqCE(5_d>l(4tk1v9!V7PB%Vx{QO=G2NC@c1%3rEzw zN<6i?h;CJX>h)kn49Sr)g#Em6km6ESP`1qc5C3ZHizN>r>V-fSS=X1nT{+Thh@kC! z(H=PlqDt7V6gOYezXUK-dretz!1?IUD6&eL2b!4=9h+HUO&DYZKMM>|YhlEEg?q?S z^XT4$2Fd|zT=x3U#L1|F;-#`to-Y6hiYkWdO=rRC)meY72pIfl`3zEGDU8($iWR^K zI$nq80aSJII<;#W5Pj>^_T&013BJ*O89Uoq z5>;Paa^E}xar^r=!pexg&OTM8wluk4R~Ru=)Hgk`Y#i_$jk{jc8hx}?(dW*X!l4vs z6_%$s#duJJFmaFc-5#>v6Yea=I~)s_pXGS>Tkz?s+WS}>Qp<9MappMLXpkXpSM~SmH6u)`Z5>o02kJs;w@KhdiZ3}29y*xr|6tMo zBHzGic+b+dTd!xOJ;p{Rguh^corJ;K?R6daayQKm+0rf7|AXg0qs!R9eS7t4{G=fs z1$=?kK1Ih=gEkI>@jgXDWHZt*C7FUEWs|u^pE3Z``^K|1KEC^sbN*4nQUfRc_AyE0 zn)?RrGjgPkzfE~_s!rDB!fDsV+*|kEX4+DyS#8%!cshn;s8svwBXSsDGX2ZRa0={* z=`p1F{zD17*Rk>Uk_cw3t5j=9-d6$}MoM~z{v{t^M!g75-+o8_XkP@CZWUQ2z!^26 zCNOu~hgrrK)y>bgqb{`Q_1^zrG4;cGarP!nb4E~(ZKWc`LVeEq;IewVneLp^ZU2+% z95PgN*M5v7Q;ZlGvM#`&u2NdHm%&gZ{bZM5wBCp&?HeZhwU87wyT_z!n4z+1?=RvXZ^72d*%+R1s1$KbAFtR|= zw;MEq=O7pMIKpFwKH6$OOszJAf<_Z<1)36cB>D>|Z6$gJL~jH`n3MMou$#Si%rDAu z4pSkJspG|^CJ86vg6kkfXsA_`8@8iOryOe!Qhn8SV6}mPlof3=WJRVqAr_b;e->`Z zMR(p|K|$L0^6;u~USxg#B6-ZNc%E1dv*^P=|2k*^NOBni#G%9Y?##{=)8KZwh85OL zSBG9|gb|hdmY^gn(ziY&O5#@I?W)W;361Yb^VQNpz0A7&^(7HRAsUvw#)fvhocvja zLxV65J0_$>&cVRctJFsn^qLos^tG`+B0_gQ{NeOwKt-!C^gGFufdtPT*Vi>l#X1|V z2XxsAcixN)Ekq=a##_^=k_^BFH5_zpvPDRP>u6+3$}i&b zy0@FdzAHw?i9OqnlTts_w5D@Nd#eM)KKEuN#m{|AJyscxa}(eA?z4&4yvXo{OBS65 z-?gW;<+;+ntM}U_yTmHm6*2zj0Imj<&ZgE9Wj|gfsXhrVH-c0p$7HXnR8bxDYOi z=_r3FA~u`L&2;Vir8}P3)k|@c?sK1U@&iWo{HEXcoy>6wQSuJ+b4l%aTBuigs&k@Y<2c=S3Ef?p zH>ki4yDuXdo_eu>X1{E$g(Q-u#zVXN^&%70guoizo7x(kQ0OZ}H$O9UB}(FaX8Ct1 zFpx~}EbHf2r6V;x=@8GH$C2|6*?K~?LrtMYd^bw*WYXhA z_))@RMH;nZedW3+qfWbv<|_#BYOxX^rhbN+!za)|!|8K*LRs(R$O*2SDM{g9k7e{u zN4VIdi}e#0&h?sBxu$>Yy%)j(k1V2fuhp8r!}gfF@b;F?U`6}YnnMh1&sSU&lR^?# zu!61+lGsuFEfDraX3+$QZibCbKzc{75G^T7@WZSQ)j5898G1AOXB*H*TSd`f<`IK# zm1%&t?i|2Z-a&r!pJehzg@!awNp)R)aa?q_SqGrxE5u+T#f?K2;GAHV?O&>!W@Q*k)7=g2vDW+7K zbyY9i{|nOF*SbMYoRQSAbSH2y$bE5(@d6xKxcF#@TE~X#3o=;`0sc!RupdRmQsML? z&>SCwS{FOpSr+@6Uuz3m`hj}(^g`Jz|6?({!%WVJn$H|ugxW+x-GEA?J&U^ugj3Nb z;65~)W<}iH2PJ@st8LtLfSOLXYgj=9<;?ih7rq$bXW9J#!B8!Wu6#U`A$wlcoC*&` z_9Js~7%m79#+edeT&P`@_Ng@e&5J+pqpx%31tAF71)pcz~-yJ>P5yX(nuM4;bUHDa8E(~~l{j~JeCGkX>nHJDpgSf&bTHEf)qw8{Q~CBPEVen|MW2P3vmf`8X9-g|>>ddp zcgfjbl~(?3Wa*NzQH>4nsM$3}Ul>pX1xC0oF3TZXe7=V!9!n?WgvH|R zpbruczmB%z=zkZ>=1R|gXwGThLELqD5KCUhtiRGT*JwKIvzbzV%ZU!e!VcNHSSX3> zObH|oohc8nvQZ2}q??C}@>!fe3gH+HF@4(qWqi>;ag~md#D;cl8&gQb^?2a@5cikT z=7r78@&5gV3Ggc9f=<<8v~yz`NcEGvbX1V_`IL(&+Z>LB zM~$ok2qXzod@1$TEl*U~H$V5g$er{Uj^($sWb7Nr{gsIbE(`$LRGECTOraXiU%=uq z0zvpi1S%)RxTjzoVcR4#10)fs()4Mtsa@e?9j)Bk!LsYyXIZga2q7d%`vQE!V@<1Y zmkpH3LeXJNO9f7l>F84g;huc=4nk(UnU}RLZmYk2TtB#lv34K(?8~gyx-mN%g=U44 zOPdr_!j-;IEbe|l9-buuKEy^Q9MLjSKG$S6dz)!U_32{1)N}L)3+COmlg=nY1@od$ zJ<0z-B%sisAR1yh>z-RfQQb6M4i-d#vxvb~f69M{JLPZv1JSCh1$gQ*LxOF-tH9!k zbQ0ZW)S7)qCSF|=2`q_A3}OHBNBueZwTTz^ar~gz#2KA74&&D)KHt~m4F_nK<^*7_ z!!pN@xiGkq%>1N(rNxw$zu-=1t*IpAy$ z4~dD0w%9;E?(greVWZ3(o9ux`elM>Rek#0 zO=#-(4p5B+wFzlEU7^k{3EdL6sIp|K*>xrriI`}E8ze|z-$YpN`^_teL_7P`%e>IN z7tNiH619P+0Q1hBR|W#POOta)1|LkIRtgz zMJ9VOxXN#o)mlXS=u%`Q>~PBuKEmOWsIuQRp{y%!ty{fEyL0gV)$LQeL#pqX3L@SR zJ2Gb^E9+KVd?;joVOXlGie3?z6>(>u(i!(qGz(W( ze~^xj&IRF<98ypEis{Y_FoHn%C0bW(XeF#Lj=2WUEBqKNPPFppEH?_a3}-h906X}C zSYKcZFU`Om5YlWhh@ogzCn3NvuM~F9jOX|xe-X*!YL+#ceh_tJoHXz`aTnvSrOAZ| zOtdGz?QdT!oAJr3(XL2G(p%2X4{xEohU&vd_zQ(U%ihHOlKPWnb$&YYhx48?|R++>`5?sxvM?!;ru|9 zZ#nwuTK^S%ce<+ggdJBE&fRrXN7O!{nu`%q`M{2Ef_+IRad2cf01P9pST9AOK>y75c!9}~)Et^6$`&Nm{wzWcm4c0j9DF!xJTpGrMp3esI4D_iiDe`sswXSu{dQZE_`^A11 z?Z@Hw=65mVu^%X`>;$mciK}XiZ{xw7I_!t)S00^JuxdCXhIRO~S*lPS(S^je`DH4E zxbKNs8RL`N?gCQ@YSOU=>0FE#Ku#DRO7JA&fu-X8b;3!^#{=7`WsDXUxfUsE(FKSQ z&=N`A7IwLq%+vt(F;z+T=uZNl=@K4|E%p{p^o5(BGjsE|WOR`%8+XgGW8xJTFJc4L zVY#L`OdnSM{HyS$fX1)3_JuNNH1aDsDqi>CzCT5=kY5zV<~29bX)c^I8R5n&ymHkx zj(QC4t#mDK;2xi8O%V;C{HqDQeM64=b4@sa*N_K0a&ro4+8LY6cFHz< ze|!g}zF|tDrP=`+U7KwKl20gdW1%!iN>1=uxA|NZJ2peruBOj?RBPb~8G;s6xIi6- z?_odhafsxoxiBf zwZZ)c*)FLc0#wE~bXw0TPBYl+h9hs|DYr_B4LR_YL@S1hQs=p zNEh%_fUvWZCbJtaF#kP5=(O#{8|g&Kmz1&8{@Lufw^DhtvKx955~aqxi2C=)Z-!Kd z+m-u+#^U4(HYn6a1w652kO0bYBt&goyx(n?MR^kI+{Q?0Y{G~W2) z0dS3fuJ?SU(6ZDp=kUley%PK}K_;YQyK|U|?7t9SHiyIfpT4a_kUVIhH4PSaj@3mo z`z}|mHhx1Pq?@(3vTBb5HTXuFAzFZEt0D-fw_kd=XvwIUh3VXTm{wbDA~cESd5cI1 zd>6=&AvG3yu+)`9oxmfrDQ(1fzv(_0l?bp{a364dXLRRBI8kBv!KsL;brY)#E3`o{ z3TlWUsS0{Voci?6MejccG9x_KiqN>So*1{25r6BSl9jUyR}1TgXBLL7Pr6Wv~Nu47;fbiU7TbL}>qmtl36YSZ() zVf@nqW(As~#`@bIC+AxSw!O5Pocf&rYaCFm?Jd?XR)p#@{!|5^Ws@wd855)mI^8y{ zws+VvGXW6%xoj@JkGb=~%oJ~7m6+uhOv?bH+jJJ~eFgp+}~*^C+3>R-MY!IZQoabCh( zN(T+z@Oyc^C)WqQESmh{d!!T8zS(!wX=R#hEKxMXy(eg zZ+Cwm1a%?;RH$h2_ws|nRjn8ZY!>3gn+6Ep4xT|AeFox7!rac2Lw?jsz}JqPE?5JG zok0}q1P;cuzs%Yrze|&d$oTr<`Lx{fbq2OV=!3v-ODq(n?|WxuhtmwJBIoW^^FB+D z-?Ok9HBKc5@)L(W&vmI{prL?4^OE9TR)bELS=<>*w%&aKjzi*@;5#P3moG@dm{Eke zhE#Is;&=o|{2GWai}7LYEI+gmc^Kj4K7w7n)+9godg?yB2?xs}pF1<*!Sv?D~Uvbkgs9xx9s#6zBv9l@ox>d#H6eqw^KZO;Vg}h!q zI33^$4}yF*q+q{DsJsa(SsV!YQ#zi^IF9MQV6i{SiN4dWWCi%YQ+hNc1r!^+<(YnB zG62-D`M3w3Q2;@X{S`n`{QO>migDpz0FK`->sYDOESs6u>-~<}_XN_6><2g7U#XC{ z$#Ig;n{_yEMnlvx-lP*;ts#DHV0r8j518>~33?Ak#jocW>uk>6V||p7{4rov#RS9c zdPD6r`qF1om9r!zS4Jk1>7fn#GCnmD=JIt1Na`X)=*LP7R!3XATgk`;&U*P<(0d z9p<0T&eYqQ9jot39FxpfuPSPYlfQ$s-*;+c1KL+cHIVcG5`H~^Ryu1Hk7%Nf$TCwR!SzG31@NHpm`mcp8v!wyWM49TjTxASJ-8JP*MTHLC}hF==PUOh8kaaXeGFGd<|e29vSDaS ztPeu&zv0^wN}Hahi`$pcDs~FVt2F;K!q}q*Y@{7i#stWfU`u2La4aerBKhV`^zG~j zJWvtZpcHIP7x*tfLSQcng6D(`HVp4=LWp_0Xt=2wEHjK)!DSz_Z?5J@>awRyk?azj zU-kdSs~cp))*pfJ_q7u`IsCq8F|OShB~D56S(Mwwlt?{yURE7#eI&WcpVq(@9Fd~g zeUiD!a4w51Nj(YzLnau+O3MDub|?loF0=<#jLztAM>PruE7yNDD0L}y=Ayuc?^?Ni zf~%GK=iEhn2}xKp7GonJx!JpDmDsco$|$XtRdUDwbM9$9s7x9-of2nKNj~?b@UOKz z9{`=Irz^ba-c&1vSQxSh;I2`cKc8-4)aCy%#bam;3_8vSJ-jw`_}lyukEC~z00EbC zI*dU3F21A)dSZr{qA5QF+{a%D`h#?8o%M?)*hWxuqnQD(TpcmfNq&UN$BmB)0!r8) zxno@Q?$_D&*4(rW6b+?-Y^5|*P`DHmJ%pI<6*yP)o}2^?>d7P#bd2j=vvx2mfLW@R zQLD`%buR*}nzNYNf%68w-D$7%v|=bXg1mYrdZy~}(@RRZ-U+Gx=nmCjVxr5Ag# zLw3R29-MHJl|`mRxj#sv@EfyR#-q>BE-XFEENbV$#dWM?!VjU8~kKZsd@G=HPrI{HiqN&j<92*-3$^M*;n@rG*i! zvi#?j;lc5w>@+r!6*CVUrN9as=S3?(ZBT979$5R#ZpPm?2VjIyQcEFp9orGR>f;G? zK<~FiYY6ow-&}|v7k?+03TC++so$)2~rN``u z>N%j$AbNQLX_!evzG8abf=15260vIXdz7K^a$YS)iw{@x5<|Rr#ii|ov=LJ{eu>dZYe_ip$ZuzvRu1dpjQK1BvP zH~m#t=2_wy>9+YkdNF-z` zQ*#7=^r%R*pIi2AI`>n9>(QJVE1k8?Ilav<)NUjW^O$}^yZZ{_Uwn!4Fq1`aslX;Y zj`XDIm`E1sz|wShA=?a@ZGKDSMU#Z3$E!1nZ)g^Eg3ZDoSN6@RXrGVCHvMIauS7d> zuJltXf9)LdTWdF!n%-iA9b#2$W#i??K)zYho^((ZqluvhAr@{H{diy0%@-~VW zKYC|2Ma)2^=skdLT@ZVqJfiCDqS@~qIGexL(BKy6Aw9ch0hoHN&E+m3*uka9+AIh3gTWdSe~W({-&^oFw`!j7$DcsF$7`pO?kRMK<9h=SV?cmyJIe`$4|zoI(6u9#qY9zM?#zNe^!Dl2>Z^dH`>`wSY# ztU;V*+g0R0DH6EnJA$U{QL&T~&s{`smeC2I-5mzv=v$l@iF;yN0hMibU=CG^e>J;+9k`Si9PzLaj$>}QKI6lWmO_o+_( zmhxA*0|-Na`+*J1qEMIXZf9rb#;pcOw>EDeDjb!|GumQ2!1ac;YqU|X;F@l1_lemzTN0J|U zFJF(kO21aHg)*KfuKT=BA{VDkOvlx(b{f|A9D69_BHUm#S$F>~`Mt@GesjLp3;reY zP~q>6Tt;`XkjqV?i7lqPbWGh`y<7dq<}pDHl-dDA4QG6`QDq)+vq_&HfW!}P6Cp4d zt>Qnli5ri*I1ILEOGD~3Y!@2^Jmcy1xDXmKolC?at}_6;neEfca0rLHT}NLpoUYh` zDbCtfZnYN&>}m-(F{5d1=)bBuZ?OcP`GmsQV@kn%JMJUIep`Avon#8=ATpEo-@hg& z12f-)R=HCD%pUjvbWa|P!}u)=wInpZG*LHKrZDMeC>Qils^IyY)x;kDRs4c3!DDOG zAptSsf#1X>kSli|Qka@S)6O4un-2aKL?bcV;$*>KSxHovjrfZ^-+c#>;(42yj71K| zzRyFiLrwv$rPcNA{mtv=o(*JDA0kS93>OE0D{KMJzLk$cc_5dCLWnJcFJd6_>BpE< z?aW9;^!;arQcIjloW&YL+~MkNO&a>N=pmhg>{SM<@`a&VeUA`ay*P@R$_+WS2%r?_ zs&Z%c`>ie+%!I=Lz>$9$7a`-`hoc&*dl60^whsaQ;~9~@JYn1Oc_bmgVVyAzUOYgZ z#j{`#D_YZ)(wa5;qzR#zo4a|-ANJjBB90r4Iun3*BkMxw_Ti>SjhktsmR|BPCLt>9 zZ_3eQjweI*-8+HNt)$9^s|+10w@sU!PY{`#BnF!ULS=#{k0Zr5`yOS?p8PfWbKT`6 z@T+PeRJ4`fj5t8bMs)0>o9|C>mBTlfQ*nFG#Rri-Q7}E}+eaz`LmO!`Y_pHkoAruu z`&!5VNnA3IG$}Pz)V&pt&AF!$E{J-;or3vWv3&Sl&9KzG+ae73Zf}=aP*SCI1{?0T z9SAC)W(?DSKOkcmW$(K5Bl?c@(5#>J#j@eq#ctX~$TIjkl>Wrfv%Ey+bl1Z-v?NxJ zwZ9!ae-MsHPUx&_W22?9$mCE%&~lzVG?hDXM%~gXGk+Q!Jf0BspkMWxy;^!n<6JIrSYjv z6F%~$8)0^qbUho9Sdf97b_n({$;|XH9-RHrohHuPcro@03KEPFejN&q?&nJFoIQY; zSI#uL6>2^^yOR!51OLO65xGas55dPG;3=uQ35ZYW04#+~byXQf^7Vq`G z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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:example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/.gitignore b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/main.cpp b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/resource.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/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/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/.metadata b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/.metadata +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/.gitignore b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/main.cc b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.cc b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/.gitignore b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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:example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/.gitignore b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/Runner.rc b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/main.cpp b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/resource.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.cpp b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.h b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ From 29205adce411482786e6110789dcac705531fdff Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:00:05 +0200 Subject: [PATCH 08/30] Chapter 11 challange updated --- .../challenge/.dart_tool/package_config.json | 686 ---------------- .../.dart_tool/package_config_subset | 453 ----------- .../projects/challenge/.dart_tool/version | 1 - .../projects/challenge/.flutter-plugins | 20 - .../challenge/.flutter-plugins-dependencies | 1 - .../projects/challenge/.gitignore | 126 +++ .../projects/challenge/.idea/.gitignore | 2 - .../.idea/libraries/Dart_Packages.xml | 372 --------- .../challenge/.idea/libraries/Dart_SDK.xml | 28 - .../.idea/libraries/Flutter_Plugins.xml | 7 - .../projects/challenge/.idea/misc.xml | 6 - .../projects/challenge/.idea/modules.xml | 8 - .../projects/challenge/.idea/workspace.xml | 71 -- .../projects/challenge/.keep | 0 .../projects/challenge/.packages | 119 --- .../projects/challenge/.vscode/launch.json | 56 -- .../projects/challenge/README.md | 16 - .../projects/challenge/android/.idea/misc.xml | 9 - .../challenge/android/.idea/modules.xml | 18 - .../challenge/android/.idea/workspace.xml | 119 --- .../challenge/android/app/build.gradle | 18 +- .../android/app/src/dev/google-services.json | 47 -- .../src/dev/res/mipmap-hdpi/launcher_icon.png | Bin 3432 -> 0 bytes .../src/dev/res/mipmap-mdpi/launcher_icon.png | Bin 2232 -> 0 bytes .../dev/res/mipmap-xhdpi/launcher_icon.png | Bin 4564 -> 0 bytes .../dev/res/mipmap-xxhdpi/launcher_icon.png | Bin 6570 -> 0 bytes .../dev/res/mipmap-xxxhdpi/launcher_icon.png | Bin 8943 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../android/app/src/prod/google-services.json | 39 - .../prod/res/mipmap-hdpi/launcher_icon.png | Bin 2606 -> 0 bytes .../prod/res/mipmap-mdpi/launcher_icon.png | Bin 1671 -> 0 bytes .../prod/res/mipmap-xhdpi/launcher_icon.png | Bin 3496 -> 0 bytes .../prod/res/mipmap-xxhdpi/launcher_icon.png | Bin 5155 -> 0 bytes .../prod/res/mipmap-xxxhdpi/launcher_icon.png | Bin 7091 -> 0 bytes .../projects/challenge/android/build.gradle | 3 +- .../challenge/assets/animations/loader.json | 1 - .../assets/animations/on_off_switch.riv | Bin 3955 -> 0 bytes .../challenge/assets/logos/logo-dev.png | Bin 12084 -> 0 bytes .../projects/challenge/assets/logos/logo.png | Bin 9867 -> 0 bytes .../projects/challenge/coverage/lcov.info | 208 ----- .../challenge/flutter_launcher_icons-dev.yaml | 5 - .../flutter_launcher_icons-prod.yaml | 5 - .../challenge/integration_test/app_test.dart | 24 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/challenge/ios/Podfile | 2 +- .../projects/challenge/ios/Podfile.lock | 180 ----- .../ios/Runner.xcodeproj/project.pbxproj | 593 ++------------ .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../xcshareddata/xcschemes/dev.xcscheme | 78 -- .../AppIcon-dev-1024x1024@1x.png | Bin 68393 -> 0 bytes .../AppIcon-dev-20x20@1x.png | Bin 645 -> 0 bytes .../AppIcon-dev-20x20@2x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-20x20@3x.png | Bin 2159 -> 0 bytes .../AppIcon-dev-29x29@1x.png | Bin 994 -> 0 bytes .../AppIcon-dev-29x29@2x.png | Bin 2101 -> 0 bytes .../AppIcon-dev-29x29@3x.png | Bin 3105 -> 0 bytes .../AppIcon-dev-40x40@1x.png | Bin 1421 -> 0 bytes .../AppIcon-dev-40x40@2x.png | Bin 2861 -> 0 bytes .../AppIcon-dev-40x40@3x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@2x.png | Bin 4009 -> 0 bytes .../AppIcon-dev-60x60@3x.png | Bin 5577 -> 0 bytes .../AppIcon-dev-76x76@1x.png | Bin 2674 -> 0 bytes .../AppIcon-dev-76x76@2x.png | Bin 4599 -> 0 bytes .../AppIcon-dev-83.5x83.5@2x.png | Bin 5040 -> 0 bytes .../AppIcon-dev.appiconset/Contents.json | 1 - .../AppIcon-prod-1024x1024@1x.png | Bin 45287 -> 0 bytes .../AppIcon-prod-20x20@1x.png | Bin 480 -> 0 bytes .../AppIcon-prod-20x20@2x.png | Bin 982 -> 0 bytes .../AppIcon-prod-20x20@3x.png | Bin 1478 -> 0 bytes .../AppIcon-prod-29x29@1x.png | Bin 689 -> 0 bytes .../AppIcon-prod-29x29@2x.png | Bin 1460 -> 0 bytes .../AppIcon-prod-29x29@3x.png | Bin 2122 -> 0 bytes .../AppIcon-prod-40x40@1x.png | Bin 982 -> 0 bytes .../AppIcon-prod-40x40@2x.png | Bin 1945 -> 0 bytes .../AppIcon-prod-40x40@3x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@2x.png | Bin 2747 -> 0 bytes .../AppIcon-prod-60x60@3x.png | Bin 3743 -> 0 bytes .../AppIcon-prod-76x76@1x.png | Bin 1839 -> 0 bytes .../AppIcon-prod-76x76@2x.png | Bin 3099 -> 0 bytes .../AppIcon-prod-83.5x83.5@2x.png | Bin 3369 -> 0 bytes .../AppIcon-prod.appiconset/Contents.json | 122 --- .../projects/challenge/ios/Runner/Info.plist | 17 + .../challenge/ios/Runner/Runner.entitlements | 10 + .../projects/challenge/ios/config/dev/.ignore | 0 .../ios/config/dev/GoogleService-Info.plist | 34 - .../challenge/ios/config/prod/.ignore | 0 .../ios/config/prod/GoogleService-Info.plist | 34 - .../projects/challenge/lib/dynamic_link.dart | 37 - .../lib/generated_plugin_registrant.dart | 22 - .../challenge/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../challenge/lib/l10n/messages_pt.arb | 4 + .../projects/challenge/lib/main.dart | 128 ++- .../projects/challenge/lib/routes.dart | 169 ---- .../projects/challenge/lib/routing_table.dart | 174 ++++ .../challenge/lib/screen_view_observer.dart | 41 +- ..._screen.dart => tab_container_screen.dart} | 4 +- .../projects/challenge/makefile | 23 + .../.dart_tool/package_config.json | 1 - .../.dart_tool/package_config_subset | 293 ------- .../component_library/.dart_tool/version | 1 - .../packages/component_library/.packages | 79 -- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 17 +- .../component_library/example/.metadata | 39 +- .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 6 +- .../example/ios/Runner/Info.plist | 2 + .../example/lib/stories.dart | 16 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 ++++ .../example/linux/flutter/CMakeLists.txt | 88 ++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 +++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 +++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme} | 28 +- .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.lock | 103 +-- .../component_library/example/pubspec.yaml | 1 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 +++ .../example/windows/flutter/CMakeLists.txt | 104 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 + .../example/windows/runner/Runner.rc | 121 +++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 + .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/component_library.dart | 1 - .../lib/src/count_indicator_icon_button.dart | 50 +- .../lib/src/exception_indicator.dart | 12 +- .../lib/src/favorite_icon_button.dart | 57 +- .../l10n/component_library_localizations.dart | 45 +- .../component_library_localizations_en.dart | 12 +- .../component_library_localizations_pt.dart | 42 + .../lib/src/l10n/messages_pt.arb | 13 + .../lib/src/loading_indicator.dart | 25 - .../lib/src/mixins/animation_mixin.dart | 33 - .../component_library/lib/src/quote_card.dart | 12 +- .../lib/src/rounded_choice_chip.dart | 56 +- .../lib/src/theme/wonder_theme_data.dart | 61 -- .../packages/component_library/pubspec.lock | 502 ------------ .../packages/component_library/pubspec.yaml | 3 +- .../favorite_icon_button_widget_test.dart | 46 ++ .../component_library/test/widget_test.dart | 15 - .../.dart_tool/package_config.json | 308 ------- .../.dart_tool/package_config_subset | 201 ----- .../packages/domain_models/.dart_tool/version | 1 - .../packages/domain_models/.packages | 56 -- .../packages/domain_models/pubspec.lock | 348 -------- .../fav_qs_api/.dart_tool/package_config.json | 440 ---------- .../.dart_tool/package_config_subset | 289 ------- .../packages/fav_qs_api/.dart_tool/version | 1 - .../challenge/packages/fav_qs_api/.packages | 78 -- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../packages/fav_qs_api/pubspec.lock | 502 ------------ .../packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../.dart_tool/package_config.json | 614 -------------- .../.dart_tool/package_config_subset | 405 ---------- .../forgot_my_password/.dart_tool/version | 1 - .../forgot_my_password/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/forgot_my_password/.packages | 107 --- .../lib/src/forgot_my_password_cubit.dart | 16 +- .../lib/src/forgot_my_password_dialog.dart | 11 +- .../lib/src/forgot_my_password_state.dart | 19 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.lock | 698 ---------------- .../features/forgot_my_password/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 608 -------------- .../.dart_tool/package_config_subset | 401 --------- .../features/profile_menu/.dart_tool/version | 1 - .../features/profile_menu/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../packages/features/profile_menu/.packages | 106 --- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_en.arb | 4 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 28 +- .../l10n/profile_menu_localizations_en.dart | 6 + .../l10n/profile_menu_localizations_pt.dart | 40 + .../lib/src/profile_menu_screen.dart | 34 +- .../features/profile_menu/pubspec.lock | 691 ---------------- .../features/profile_menu/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 668 --------------- .../.dart_tool/package_config_subset | 441 ---------- .../features/quote_details/.dart_tool/version | 1 - .../features/quote_details/.flutter-plugins | 13 - .../.flutter-plugins-dependencies | 1 - .../packages/features/quote_details/.packages | 116 --- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_cubit.dart | 26 +- .../lib/src/quote_details_screen.dart | 160 ++-- .../lib/src/quote_details_state.dart | 15 +- .../features/quote_details/pubspec.lock | 759 ------------------ .../features/quote_details/pubspec.yaml | 4 +- .../quote_list/.dart_tool/package_config.json | 626 --------------- .../.dart_tool/package_config_subset | 413 ---------- .../features/quote_list/.dart_tool/version | 1 - .../features/quote_list/.flutter-plugins | 6 - .../quote_list/.flutter-plugins-dependencies | 1 - .../packages/features/quote_list/.packages | 109 --- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 + .../quote_list/lib/src/quote_list_bloc.dart | 546 +++++++------ .../quote_list/lib/src/quote_list_event.dart | 44 +- .../quote_list/lib/src/quote_list_screen.dart | 81 +- .../quote_list/lib/src/quote_list_state.dart | 160 ++-- ...r_grid.dart => quote_paged_grid_view.dart} | 20 +- .../lib/src/quote_paged_list_view.dart | 77 ++ .../packages/features/quote_list/pubspec.lock | 714 ---------------- .../packages/features/quote_list/pubspec.yaml | 12 +- .../sign_in/.dart_tool/package_config.json | 614 -------------- .../sign_in/.dart_tool/package_config_subset | 405 ---------- .../features/sign_in/.dart_tool/version | 1 - .../features/sign_in/.flutter-plugins | 6 - .../sign_in/.flutter-plugins-dependencies | 1 - .../packages/features/sign_in/.packages | 107 --- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 + .../sign_in/lib/src/sign_in_cubit.dart | 117 +-- .../sign_in/lib/src/sign_in_screen.dart | 139 ++-- .../sign_in/lib/src/sign_in_state.dart | 36 +- .../packages/features/sign_in/pubspec.lock | 698 ---------------- .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/.dart_tool/package_config.json | 614 -------------- .../sign_up/.dart_tool/package_config_subset | 405 ---------- .../features/sign_up/.dart_tool/version | 1 - .../features/sign_up/.flutter-plugins | 6 - .../sign_up/.flutter-plugins-dependencies | 1 - .../packages/features/sign_up/.packages | 107 --- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../sign_up/lib/src/sign_up_cubit.dart | 134 ++-- .../sign_up/lib/src/sign_up_screen.dart | 184 +++-- .../sign_up/lib/src/sign_up_state.dart | 38 +- .../packages/features/sign_up/pubspec.lock | 698 ---------------- .../packages/features/sign_up/pubspec.yaml | 2 +- .../.dart_tool/package_config.json | 614 -------------- .../.dart_tool/package_config_subset | 405 ---------- .../update_profile/.dart_tool/version | 1 - .../features/update_profile/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../features/update_profile/.packages | 107 --- .../lib/src/l10n/messages_en.arb | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../lib/src/update_profile_cubit.dart | 62 +- .../lib/src/update_profile_screen.dart | 119 +-- .../lib/src/update_profile_state.dart | 40 +- .../features/update_profile/pubspec.lock | 698 ---------------- .../features/update_profile/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 314 -------- .../.dart_tool/package_config_subset | 205 ----- .../packages/form_fields/.dart_tool/version | 1 - .../challenge/packages/form_fields/.packages | 57 -- .../packages/form_fields/lib/form_fields.dart | 3 +- .../packages/form_fields/lib/src/email.dart | 38 +- .../lib/src/optional_password.dart | 20 +- .../src/optional_password_confirmation.dart | 38 +- .../form_fields/lib/src/password.dart | 30 +- .../lib/src/password_confirmation.dart | 34 +- .../form_fields/lib/src/username.dart | 37 +- .../packages/form_fields/pubspec.lock | 355 -------- .../packages/form_fields/pubspec.yaml | 3 +- .../.dart_tool/package_config.json | 530 ------------ .../.dart_tool/package_config_subset | 349 -------- .../key_value_storage/.dart_tool/version | 1 - .../key_value_storage/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../packages/key_value_storage/.packages | 93 --- .../lib/key_value_storage.dart | 2 +- .../lib/src/key_value_storage.dart | 15 +- .../lib/src/models/models.dart | 3 +- .../lib/src/models/user_cm.dart | 16 - .../lib/src/models/user_cm.g.dart | 44 - .../packages/key_value_storage/pubspec.lock | 604 -------------- .../key_value_storage/test/common_test.dart | 2 +- .../monitoring/.dart_tool/package_config.json | 404 ---------- .../.dart_tool/package_config_subset | 265 ------ .../packages/monitoring/.dart_tool/version | 1 - .../packages/monitoring/.flutter-plugins | 5 - .../monitoring/.flutter-plugins-dependencies | 1 - .../challenge/packages/monitoring/.packages | 72 -- .../packages/monitoring/lib/monitoring.dart | 9 +- .../monitoring/lib/src/analytics_service.dart | 27 + .../lib/src/dynamic_link_service.dart | 60 ++ .../lib/src/error_reporting_service.dart | 27 + .../packages/monitoring/lib/src/logger.dart | 7 - .../lib/src/remote_value_service.dart | 24 + .../packages/monitoring/pubspec.lock | 455 ----------- .../packages/monitoring/pubspec.yaml | 8 +- .../packages/monitoring/test/common_test.dart | 15 - .../.dart_tool/package_config.json | 452 ----------- .../.dart_tool/package_config_subset | 297 ------- .../quote_repository/.dart_tool/version | 1 - .../quote_repository/.flutter-plugins | 5 - .../.flutter-plugins-dependencies | 1 - .../packages/quote_repository/.packages | 80 -- .../packages/quote_repository/pubspec.lock | 513 ------------ .../.dart_tool/package_config.json | 464 ----------- .../.dart_tool/package_config_subset | 305 ------- .../user_repository/.dart_tool/version | 1 - .../packages/user_repository/.flutter-plugins | 6 - .../.flutter-plugins-dependencies | 1 - .../packages/user_repository/.packages | 82 -- .../lib/src/mappers/cache_to_domain.dart | 9 - .../lib/src/mappers/mappers.dart | 2 +- .../lib/src/mappers/remote_to_cache.dart | 11 - .../lib/src/mappers/remote_to_domain.dart | 11 + .../lib/src/user_local_storage.dart | 15 - .../lib/src/user_repository.dart | 98 ++- .../lib/src/user_secure_storage.dart | 50 +- .../packages/user_repository/pubspec.lock | 527 ------------ .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 + .../test/user_repository_test.mocks.dart | 53 ++ .../challenge/propagate-config-files.sh | 199 +++++ .../projects/challenge/pubspec.lock | 342 ++++---- .../projects/challenge/pubspec.yaml | 47 +- .../projects/challenge/test/example_test.dart | 17 + .../projects/challenge/test/widget_test.dart | 15 - 389 files changed, 6197 insertions(+), 28344 deletions(-) delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins-dependencies create mode 100644 11-create-your-own-widget-catalog/projects/challenge/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/.gitignore delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_Packages.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_SDK.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Flutter_Plugins.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.keep delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/.vscode/launch.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/README.md delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/.idea/misc.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/.idea/modules.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/.idea/workspace.xml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/google-services.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/assets/animations/loader.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/assets/animations/on_off_switch.riv delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/assets/logos/logo-dev.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/assets/logos/logo.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/coverage/lcov.info delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-dev.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-prod.yaml create mode 100644 11-create-your-own-widget-catalog/projects/challenge/integration_test/app_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Podfile.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/Contents.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-1024x1024@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-60x60@3x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-83.5x83.5@2x.png delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json create mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Runner.entitlements delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/.ignore delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/GoogleService-Info.plist delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/dynamic_link.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/generated_plugin_registrant.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/routes.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/lib/routing_table.dart rename 11-create-your-own-widget-catalog/projects/challenge/lib/{home_screen.dart => tab_container_screen.dart} (92%) delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/main.cc create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.cc create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename 11-create-your-own-widget-catalog/projects/challenge/{ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme => packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme} (79%) create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Info.plist create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/.gitignore create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/Runner.rc create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/main.cpp create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/resource.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.cpp create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.h create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/loading_indicator.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/mixins/animation_mixin.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/l10n.yaml delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (83%) create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.lock create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/widget_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.g.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.packages create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/analytics_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/error_reporting_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/logger.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/test/common_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config.json delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config_subset delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/version delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins-dependencies delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.packages delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_cache.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_domain.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.lock delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/common_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/propagate-config-files.sh create mode 100644 11-create-your-own-widget-catalog/projects/challenge/test/example_test.dart delete mode 100644 11-create-your-own-widget-catalog/projects/challenge/test/widget_test.dart diff --git a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config.json deleted file mode 100644 index 604b1f70..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config.json +++ /dev/null @@ -1,686 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../packages/component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cupertino_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../packages/domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../packages/fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_dynamic_links", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_launcher_icons", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../packages/features/forgot_my_password", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "form_fields", - "rootUri": "../packages/form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "image", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../packages/key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../packages/monitoring", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_info", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../packages/features/profile_menu", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../packages/features/quote_details", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_list", - "rootUri": "../packages/features/quote_list", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "quote_repository", - "rootUri": "../packages/quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "routemaster", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../packages/features/sign_in", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sign_up", - "rootUri": "../packages/features/sign_up", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../packages/features/update_profile", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../packages/user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "wonder_words", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T01:15:17.080565Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config_subset deleted file mode 100644 index a8a6cac5..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/package_config_subset +++ /dev/null @@ -1,453 +0,0 @@ -wonder_words -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/lib/ -flutter_launcher_icons -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -routemaster -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins deleted file mode 100644 index da75d698..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins +++ /dev/null @@ -1,20 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -firebase_dynamic_links=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/ -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -package_info=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins-dependencies deleted file mode 100644 index 468e3a2d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"firebase_dynamic_links","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/","dependencies":[]},{"name":"package_info","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/","dependencies":[]},{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/","dependencies":[]}],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]},{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_dynamic_links","dependencies":["firebase_core"]},{"name":"flutter_secure_storage","dependencies":[]},{"name":"package_info","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 03:15:17.879613","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.gitignore b/11-create-your-own-widget-catalog/projects/challenge/.gitignore new file mode 100644 index 00000000..a801afa8 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/.gitignore @@ -0,0 +1,126 @@ +# Miscellaneous +*.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/* + +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* + +# Flutter repo-specific +/bin/cache/ +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/docs/doc/ +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version + +# packages file containing multi-root paths +.packages.generated + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds +.fvm/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +**/android/.idea/ +*.jks + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/.last_build_id +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Coverage +coverage/ + +# Submodules +!pubspec.lock +packages/**/pubspec.lock + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to the above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/launch.json +!.idea/codeStyles/ +!.idea/dictionaries/ +!.idea/runConfigurations/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/.gitignore b/11-create-your-own-widget-catalog/projects/challenge/.idea/.gitignore deleted file mode 100644 index 4b922951..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/shelf/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_Packages.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_Packages.xml deleted file mode 100644 index b82a1a79..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_Packages.xml +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_SDK.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_SDK.xml deleted file mode 100644 index d5634f1a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Dart_SDK.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Flutter_Plugins.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Flutter_Plugins.xml deleted file mode 100644 index b0f69711..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/libraries/Flutter_Plugins.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/misc.xml deleted file mode 100644 index f8c5fc91..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/modules.xml deleted file mode 100644 index 2504908a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/challenge/.idea/workspace.xml deleted file mode 100644 index d48a48fb..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.idea/workspace.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1636557511999 - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.keep b/11-create-your-own-widget-catalog/projects/challenge/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/challenge/.packages b/11-create-your-own-widget-catalog/projects/challenge/.packages deleted file mode 100644 index 21987c0a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.packages +++ /dev/null @@ -1,119 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 03:15:17.034724. -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:packages/component_library/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -cupertino_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:packages/domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:packages/fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.5.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -firebase_dynamic_links:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_dynamic_links-2.0.8/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.1/lib/ -flutter_launcher_icons:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.1/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -forgot_my_password:packages/features/forgot_my_password/lib/ -form_fields:packages/form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -image:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/image-3.0.2/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:packages/key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -monitoring:packages/monitoring/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -package_info:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_info-2.0.2/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -profile_menu:packages/features/profile_menu/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.2/lib/ -quote_details:packages/features/quote_details/lib/ -quote_list:packages/features/quote_list/lib/ -quote_repository:packages/quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -routemaster:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/routemaster-0.9.5/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -sign_in:packages/features/sign_in/lib/ -sign_up:packages/features/sign_up/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -update_profile:packages/features/update_profile/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.2/lib/ -user_repository:packages/user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -wonder_words:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/.vscode/launch.json b/11-create-your-own-widget-catalog/projects/challenge/.vscode/launch.json deleted file mode 100644 index 6bed9c18..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/.vscode/launch.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "wonder_words (dev)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "dev", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (prod)", - "request": "launch", - "type": "dart", - "program": "lib/main.dart", - "args": [ - "--flavor", - "prod", - "--dart-define", - "fav-qs-app-token=YOUR_API_KEY" - ] - }, - { - "name": "wonder_words (profile mode)", - "request": "launch", - "type": "dart", - "flutterMode": "profile" - }, - { - "name": "fav_qs_api", - "cwd": "packages/fav_qs_api", - "request": "launch", - "type": "dart" - }, - { - "name": "quote_repository", - "cwd": "packages/quote_repository", - "request": "launch", - "type": "dart" - }, - { - "name": "user_repository", - "cwd": "packages/user_repository", - "request": "launch", - "type": "dart" - } - ] -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/README.md b/11-create-your-own-widget-catalog/projects/challenge/README.md deleted file mode 100644 index 3be5e496..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# wonder_words - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/misc.xml b/11-create-your-own-widget-catalog/projects/challenge/android/.idea/misc.xml deleted file mode 100644 index 6199cc2a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/modules.xml b/11-create-your-own-widget-catalog/projects/challenge/android/.idea/modules.xml deleted file mode 100644 index 09b8b0ca..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/modules.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/workspace.xml b/11-create-your-own-widget-catalog/projects/challenge/android/.idea/workspace.xml deleted file mode 100644 index 4cf51c19..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/android/.idea/workspace.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1635811920603 - - - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/build.gradle b/11-create-your-own-widget-catalog/projects/challenge/android/app/build.gradle index 9f73c425..7d93d0b6 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/android/app/build.gradle +++ b/11-create-your-own-widget-catalog/projects/challenge/android/app/build.gradle @@ -24,31 +24,17 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' +apply plugin: 'com.google.firebase.crashlytics' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - - flavorDimensions "flavor-type" - - productFlavors { - dev { - dimension "flavor-type" - applicationIdSuffix ".dev" - versionNameSuffix "-dev" - } - prod { - dimension "flavor-type" - } - } - - compileSdkVersion 30 + compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.raywenderlich.wonder_words" minSdkVersion 21 targetSdkVersion 30 diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/google-services.json b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/google-services.json deleted file mode 100644 index 9cd7d360..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/google-services.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "project_info": { - "project_number": "67633443658", - "firebase_url": "https://wonder-words-dev-default-rtdb.firebaseio.com", - "project_id": "wonder-words-dev", - "storage_bucket": "wonder-words-dev.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:67633443658:android:a76ea13116df0119a8c7b3", - "android_client_info": { - "package_name": "com.raywenderlich.wonder_words.dev" - } - }, - "oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBJZHdBdsSfW8Sjqt4-ShjBj0_4wZVrQBA" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "67633443658-137oms22u49uv3dlpa0m5fm1vck85goj.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.raywenderlich.wonderWordsDev" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 7953212c6e49fb52569d83b90c2f7e2c16a0e428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3432 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 y>%SWBE%dLBHW>W`7>s@b3`Rcz2BV(Xsb< diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/dev/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 2482b9d7804a578b39be249cbd522783e378dc37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6570 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 AQ2+n{ diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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)$ diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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` diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/google-services.json b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/google-services.json deleted file mode 100644 index edce3685..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/google-services.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "project_info": { - "project_number": "581028325132", - "project_id": "wonder-words-prod", - "storage_bucket": "wonder-words-prod.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:581028325132:android:d1b724c0e1edfcc811cb29", - "android_client_info": { - "package_name": "com.raywenderlich.wonder_words" - } - }, - "oauth_client": [ - { - "client_id": "581028325132-vubnrst78erk429gp4pifvhgdbougu9l.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyCOZw3tWZSXBSyZ8e7lz5xCWsu-s4wiyRc" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "581028325132-vubnrst78erk429gp4pifvhgdbougu9l.apps.googleusercontent.com", - "client_type": 3 - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 03205927c66d55c5c2d29d1a99f078242f078e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 zcmV+}3eok6P)Dl<0a4oszz*A;C^m~{{Bv=eM_Wk)t5|1FC_}45!dLT*jyIAP}M%XlZwuv-TQLJ!u%^w{=rTF{_zQX(jw zI|L)s!?xeEueAw&+5ZWKJ--GLfu82y!N|-qj16OY)p-)+vR#5mwMJ&;fH#dH$IFn+ z+IT}mi_Z-Yt@skj*`hhy0d4-|P9M%XBNez)gl9N$nI)m=@ zIXHaoV+-!UM_+3jl5-gM)+*;Hch%-8PV99CO%r6zY)4+QH`7Il`vQ!|cfpaN_e4)- z7eW{eJhXydz<_ejgKxas#|FTpW~v=BO^~y0>B&lNJW*tP^AJn@2_@$(`;BtnHuPAJ z6`ku8)C`44l0%jx?zoRnP(4Ut=PxF-Dn&@6&DjYD&+fCGoN!QpW$k-GYb1P5H8l*< zFK&e(?y!bOQ0?+VHs^n{rQ}?NbK}2-e+(aKNLqD$*LM87yyzTFK9mk!)N~G4Agouh zOhHbi$~c3>Y=_fhLp5H}9K0wDeQi${og<^{*AbGs2&$DK5?hx;^%C*)iH4Cw*wDKf zNxEM-rU`_IPrq&z2|>P!)ha<`_*y(_lpgf{29~zH02d~8gF#Et5pcuW$eW;*h#nuG z2)A;c>rQ#me0^@d!^@&{CPd9RSlfmKeOg`HfCsj$+6^IL5RLi)IR4)~Fp;QkJaAv% z6ZrRb<(OVnz@RHCaa_Y_y^$u+gd>p@m857{`wkTQPb(Ve7M}|S*L;rd`El_$9K0RL zYJx9L{juVhsV5YIp5{Huvy;iWNic5XRs@ZkMleoy)B}ojrZRHGz7YnN+*2{E*xdh; zLJoriCFunixcLa2xcIGM+f6HW0j)xj(dp9?pbu5WxYOVEjDy50I2cJ|Np`)}ov)&? z-U_j_e*I0$A3)XKE$-8Ehw#y6vaId;?!7P+y&F|c|4k1pS%pMCuN(_b=D8|CRj~xG ziajbOgC+;b7E#Vwa6ba~E!~bG#(}bW_x9e41pXChmX%)3EdjJ0q$9I3Nq4}*{rlkX z&@(WdEY{O-(2J2eg%s*43sS9W(lxRKjmJ$(kTtQGQ;K~qh%d;A-t1j8*vH^pbV{kS zv3Cu2@N3*_7hg+nKsBs1xSPGk##XKVr(o-?$D=J+KjPN3CK;` zAnQP#B}tkR1J-Vgk#-|NJH_896|t_HB&S_GrdUbqbzG8~UY6Efg@l(-osOa{W6AwB zkzSObT}pkDzMFj2%fFab7Au={^Hw7wu$faDJkqMQbzL8#3%`hl^)LAADzOgDu6B6K z+mfq}rsUAYjfC#UA;SPf6LAbFUIuL>P6I-tB|D{%qxv}~h`b5eg;7xwyy%r)$C!=S zV5&iZ8eAu3LpzYh*#zMT4_&2^x(_(N%n|V zs#Q`?LljuvyoQ{#Jt}4emGzrP(7anKXbV(=XwIIvDEl;tM^J82$dF19g*`;lWN8(B zg5v2ccxxQ1Tu)F5qG33Vg{mYdk;y}=MXq!{L#riTw{C~|Hb@>LG-|E%Tp+JuC>#jD zg)#wJp@PAY1pYvA@j-XGg-1|&QP?0Yq6t$3U3Xt6*Nt>m_xp7o zK`Bvs$jaOK&DdN+?Hct~S19-@CO2EiPzj=mwrhG-^a&b|&q8Ogc$~1XLF#2ng4kLf z{cqqG4pa%Esb5{s%_E3S<}Z$zo-m1C%)~e-lbc}M1;S84>N|Bu{AW}kD7$yv^~ zK0JbkC;tsUx9os$@Gb}m5xg>G{b}xqawY+(9TlR@RkH7Z;&sPv;8R79o+~+)#Wt(i z7NmM|eJbQ>XQh&n>dC*!RAiu>mW*_rB#h2b+fg_<@*(H>xap1p9Q}#b+*J211*I!B zvIND17|qM5GgIZqY#U4Exr?qE0Bh#OST1)#y1eUa;&2XdgP;nyK~M$!AEDgn=+UC3 QxBvhE07*qoM6N<$f(6gmV*mgE diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index bb3c5bbfb374a4216810949d95497d1323f7c17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 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 RKb-&o002ovPDHLkV1j6qon`<4 diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png b/11-create-your-own-widget-catalog/projects/challenge/android/app/src/prod/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index f0a687ad7334f44ca7f7905874a4f18292e10de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7091 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 z 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 S2=71R0Llt#^5wE70sjY7kFd!A diff --git a/11-create-your-own-widget-catalog/projects/challenge/android/build.gradle b/11-create-your-own-widget-catalog/projects/challenge/android/build.gradle index c5a41754..a4793051 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/android/build.gradle +++ b/11-create-your-own-widget-catalog/projects/challenge/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.10' repositories { google() jcenter() @@ -9,6 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/assets/animations/loader.json b/11-create-your-own-widget-catalog/projects/challenge/assets/animations/loader.json deleted file mode 100644 index 7d4c61b4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/assets/animations/loader.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAAC5CAYAAADnCem7AAAgAElEQVR4Xu19C5SU1Z3n79arX9rddEO3goIPQMQIRtFVI4lREDBOsnt0Npslcyaj2YlRSaK7s4pJzsnZnYBJjE5Gw5jMJHM2G407ievGBAFFo6JLZtUovmlUBHk1CPRDuvpRVXfP7351m6Ktqu9d9X1V3z2nTxXU/e537/9/f/977//+HwJ1UOSBtbOB2FRITIEQnZC5TuMTHRCyExBtAFoA2QSgGVIYnwLHKfJIfAjINATSgEhDSuMTchBCHILEIcRgfAp+ykMQ8f0Q2TdF55UDdUBiX4Yot62aAonTkIudAIgOyFyH8SmNT6jP4yDQpHgn0QQh8p/kp2LeACTSEIpvQ4qHUhyBkH2AOAig4E8cRCx7AELsFrNXvuvLoALUqAhQXxx3Rfav70BGnAeZPRdSnArgJEicBIGTAXQ4btibBw8BchuAtwGxDZBvQ4geMXnZ8940H+5W5L4ftOBwdj4gZ0MQ6ODnTEDMBEChXM2yH5DvQ4r3IeQuQGwHYi9CyD+JObcOVrNjXrw7dOCXhx6fjmzmE4A8B1LMA+THIUS3F8SofBuyBxKvQOBVAC8hmXpdtC8aX3Eu/cKN35BS3iIEVzmsl8itzQr8n2cf+IfDle+r+zfKravmICvOBHAeBM4GyD+c4r7lKrQg5Q5AvAQhtwDiReRSz4mzbjlUhZ44fmXgwW+s6rnLkMPlkGKRsSrUdOHx4emt7x9+8fo7n/vboiOVeE4K/FZA/O6pX937VhCpIeW/xNGz/Txkc5+GwKWQuARCGMeo2iwSElsgsBHARrQNbxJTvzMU5KEGDvxS/qERh0YXIpddBGAxID4eZAL61betO/tw/Z3PmjYvJXoE5CMS8pGn53Q/h+98J2f6kE8V5BvfPxfIkW+XAnJhjYPdnIoSzwByI4TcKM68fbP5A5WtUXXwSylj+ODRcyFjiyHkIkh8AkI0VJYMwXubVfAX9lxC7ocUD0LKXz79v9ZURKcgt37vAmTl1RDyGkCcFjxKBqZH/ZB4CsDjiImNYs6tW6vds6qBXx5Y/2lAXgvgzwKg2Kk2Hz7y/q07+3H9nZsc94s7AgjcL6X852ceXPO+44aKPCjfvONiAFdD4hoITPey7fppS+4F8Gsk5E/ErNvfqMa4Kwp+uX8tr2yuA/BXEOL0agw4LO90svIXHZtERgr5QCwjV/3h1//geLWRb/3gVOQy5N0XIcSMsNAxHP2UzwPiZxDigUreIlQE/PLg+quRzV0HIZaFgxnV76Vn4M8PRUopBfAoBO546ldrzJUJvCF/5442jMg/h8C1gLio+lSp9R7IYQAPQYqfirm3PeP3aH0Dv+zbeBpGR/8aEF+GQKffA6m19t1u+03o8eBIJnXt5l/fnS5WT765+lIA5N0Xao2uIRrPdgA/RTL+czHzb/b70W9PwS/l6yl88P41gPxPAD4FwNP2/SBAUNv0Gfxc1zc+9as1i/X41dXcm+9cAyH+C4AFQaVL3fVLygwg1kLk/glzZq4T4t9nvaKBZ+CUHzz6VUixOlLeecMa/8EP5KT8xNN3db2MvoavAPh6dJb3hnf+tSL3QuJGMXflw168wxPwy/2P3gEhbvWiQ1EbBgUqAf6rL5786E2LGi8BRGtE9xBRQMivijkr73PbY9fgl4fWzUMWW9x2JHr+WAp4rfArRt/lCzve/fKnW6K7+fBNvjRyqZPcmhO7B/+BdX8N4Cfho1+wexyBP9j8qXrvYrhSnHHbOjf98AL8fwPg+246ET37UQpE4I9mRVkKSPylmHvbL9xQKQK/G+r5+GwEfh+JWwtNR+CvBS4WH0ME/trlrScji8DvCRkD2UgE/kCyJTidisAfHF543ZMI/F5TtMbai8DvjqFjWYHBodJqj/78b23NsuSLmhokmlKlf3fawwj85Sk3PCawvz9WstLOAzE0JCW624vzpqsth8ak93xzym/bz0XgL08ygru3T2DgCDAwZEyUsYzEQLr0pLHNhIIHWptySCYMYdLZakwsCofmFNBxvL0YG/UOfoJ725644l9vv0HT4dHygHfDu7bmHNpaJCjo21twjOCYPtkzi1o3XTz22Qj8pWk5MCTwwrY40qOuLzQ8Y1gizskFtVNobgQ6j5dKOBTbOdQz+Hv7Y7j/qRRGMsHhHSfB9ClZJRy4m+BfVYVCBP7SuHxySyJQwC8nQSgUKAjaWgyBcHyzxLu7D1sK4+VGMgXRwo8r/ppHGwIH/FJ05vGhnQJhksT0KTlU7DhRSfAvufmuDplNT41L0SmlGBfJP7x21ufnntxyvZtJWOzZ9IjAwUHjj6W1WeKkyTkk4+Zv4jN/fCthXjHANQ73H8bPHmHUJ//K5y/p3HP9Zc1TvX4DdSU9u+Pj2/UZU3I4e4a1rfPzbyexcUu4eccjxOypOUzvymH6ZH90C//6nlz9nbV4TPMuCzmWENl96+759jtW+Vl2X3XF1+64WEj5BSHlv4MQ04o1es3FXbhukfv5M5YFDg0I7OuLKcAT/BMLt8gLz8qYCoCe3TF1Xgxz2XfwMH75qL/g/9yFnfjGFc2uyTQ8CmzbG8eOAzFQ0daf168UNtzVnsPyhSNoTJV/3aY3Enj2zaTrPgWpAR4XZkyRmDU1i+42e7qfUuO4c6PEEz3Ff5VSbhYSv8mK+IOP33vrnlJtFAX/kq+tXgopbxcQC82I6Ab8BPi+PmN17z1sTQnHbfGFczJlu0UB8uK2CPxmvHMDfr269+wl4K3Rmqv/VQtGy3brlR1xrH3BREKYDSzAvzckJLgTmj0tp4SB0xuHcuA/Onw5KiF+IWVm1WP3fpvBQY4pHwH/0hWrviWl+G9CWAvE4RT8blbnhXPH0JpPxlSKz0++nEB6LFgKIztzMsgr/+NbknjhbWdb85VXFw0eNE4aCpWfbWzASIh5Z5XPFAQLz8ri/JljVh8Zr2cN/EZ1KeVBIfFn6398bPjwcXRcdPNdTW2ZkX8EsNxOT5yAf3uvwBs7nU0e9o0rP3cA5Qq1/ZvfiiOTdSYAJl7NHRq0tjOxQ7tydYMK/k1vJPHsm855d8OyYaUxL1d4dPjN5pRjAVCohe8bEuPXvF7xxut2rr5oFLOnWtOJ6HfbAX9eBIxKKf9qw73ffEC3MY6MK25cdVUsJn5nd2BOwO9WE3/ZvIy6IjMrvOff9YHAWMEpIZkwlIcsVB7q72ZtlfqdV4lDI8avFDj6XVpR6VRoBBX8dz3S6BiUNLq5Yemw6bmftKTW/9UdCQyPHuVzY0qgu80ASUMKrs/PvFIcyZ9Cevvj6l3cefQfEYZNwUBlBD5vCK5blJ9EFieiffAz36zslWPJeY/dZ8QEVOC/4qZVc4TAZgHRbvHd49WcgH/t884VOtT4zz/VnpS0Oyav61MIDQxBKTEpKCgYxjICg+nSu5Iggp8r8v3POM+nsmBmBovn29/ies0PO+0pS8I+Ae4gKBRIAyU0PD6WmB2HJvbZCfjZhoT8w4Z7Vl4OCEZzBpauWHUfIBjHzXapJPi5FV8wK2uq7bc9iCo9oIXCwQFDOBwcjI0fU4IIfpJp9UPMXm6/WFH22W+1ek9wh9DbF1MWiG4FAndEt3yWUbutF6fgVwJAYNmGv1+5Xlz+9e92J3OxfdZfe2xNJ+Dfsj2OXR9Y21LR4IXn+xMm5UzP+U7HEKTneIzgxHrl7T6s/oW/odudaPvvf7oBOy3yjttZGr6cMTWrPmu9kG/6urNnT9zy7uDsGRlctcDejsgN+AE8u/6elQvFkhWrviEg7nbKGCfg553+5rcSRZ1qaO12wiSJzuOkso+3crZ32vcgP1cJ814n4OdKx61/sW0vVzAat8w+MaPAbnanH2T6e9E3Hg94DdqzW2DnB8WvQ7tac1h+6ajtKz834JcSMp6LTxVLV6zaCIjLnQ7WCfj5LgqA7fsMgx6W1mbUzepuhdZBBT/7TqMeWuJxu8tCoM+eminpQWdlvPVQh7uBHftj2J93VJo9TYKrvpO7fjfgV1t/ia+KpTetes9NvHan4K8HZrsZY5DB72Zc0bPeUMA1+IHviaUrVlPT4FiFG4HfG2ZObCUCvz90rZVW3YIfUv4Pgt/8wrwMxcICft7B0+CHSplMwU0hNe3FSqHfv3LBLSEetXsu29C++/q7myAfEfiPckWfl6lvKNQ17DhQnHe8ktP+BdpPvxiPu9vkuF6CvgeN+RvoinnmuZBE7sGPh2sG/AT3QNpwCFLAzTuXaJ2CCzo7fpTgPznv0GG3kXoCPxVj+/voEETjGihvQD8Dd1jhBYXGJXMzmGfRG9FKm17WqVvwa6DrCD3VBLgVhp7SncVZ0+1dddUq+LmKcwXn6kyQW3UKskJnP+pccuYYFs4t70jmx3vN2qwL8PPeW/n19xuGMH6F4DIjttvfL5ufsRXrrxbArzz/dCiuPmq5rdl2uKW1l8/T+eaGK0dsaeQp3HjNaebD4KafNQl+Wr3Rr//gILDvcCw00XjMGEmTZJomWy1hBD9NYWkARI/NUn79VscfpHrLPzliyUiJTk/Pv33UuIdHB16D0oWXn14Kg5oBP7fxNJWk8i3oW3ink3Lu9CxO7a498HMbT6Bv3R3Old0KP62A34qbM5WKMyYzqpF7m4hQg5/b+Z5dMRXMw6nbrRXGBaVOLW37uZ1nxB2G6gpakE0/+H3zZ4fLbvtJjzXrGm29mtaQF8zKYMHpGUeWkKEFP4H/zGvOfe1tUTkAlWtJ4RfUyLp+sdmKws+NtyOPBtdebh7ebOL4Qgv+F7bRG8pa6CevmdqUlGhqNEwb6MtfLCBooc+/fr/ywDvy0d4oN928T3h6WBwTPYh+CgzXZGe7r98Q1DM/o+xUS3FHO/jGfIKUUo5ChT7/mpbURVAJN7Fo333+/8SgH63NOVwwK2cpyo4b8PPdTjweQwt+N/78ZsLg+CaJZMLwBGTRyTPoO5CMu7JnMnu1p78HEfxOtrd2iMIIPA1JoLvd0I1QUcbS1S5tadvtvNOLurRNWLPeXZCTSrr0qjHLKhn5eAV++vdz9VaJMBqOAt4Lhla7jVoHP4He1cZ49zkjCYZHUW2rxTe3gUcrFcxjnD7VAr+T4Jpc0TtbeV1ibNfdht+q1iSx+t4ggp99dxLGi9t1deXVZaTECjvQS/GQ239e91mNd6DbYWz/5Z/yP4zXMf2uFvithNZWfv3thk+/8uv3IRmmVSBWo15QwW8lrj7Py/pum/79TlxWq0Fzr97JY0DPXl6BGrkMeJVdrli5Spz4fGjP/BwII/m8vvNo2Cr+H7fxKpDH8bW/sptNtKCCn/2mAHj+7cQxTjazTsxiRhdTVnmXmMKMRmH5fTzHwZ74MbsC7l4XzxtVSmG7JdTg14PVRj1mobjtEifs9YMMftJWB7bk93oI0eXVfOKuQN+WuKFbTYDfK6LWWjtBB3+t0Tts44nAXwGO8bxmRNU9+rJWdZ147MsZaNTLq8QI/O6Za8TQOxpmm1Z1vFkoLMrf3ySJiPueeN9CBP4SNGWiDCbPoH//0DCUcxCVUEyjbOd4seXdOHYdtOeJRkUlbyRY+M5kQowH+ZiYBajclKhH8KujRH8Mw2NQ/v19R6B8/Bl04+xT7OkSfv9CUiX9sFPowcerx8YE1FzRwkJ9Buwqsu7BT5BzctDyTrv+mjHbqoPN9t4Y3tjpvRWiFg4UDE0NQq06xXYNtQx+DXJa3Snf/iFrfv2fWTBqKbiGlRsJs3lS7HctHCiMuIOgo061hEJdgV8D/eCAkRaLYHdarOT62/RavKKxA1qbaLAElYC08/gc9n5wGNff+azTIVp6zknobksNT6ikPf96DxsBPIql8LbarpVcf3f9trGiDkfGDUdlBUJNg59gV0E8fHDzteJo45UVotVJPbFeUDP2mI1H+/Rz284Ye15H6rHiaOM0q5DZ2Oz8ToFAGwdq9P3YHdQU+LmSM3gHV3b69vtZutuzWDCr/N2qEytEL/scJvBrxVrPHiNJhZ8lLOAvpAGPC7OnZTEjH8/RC6On0IOfKzu3gpWO2DNratbUsILRaLbt8XcilwNJ0MFPLTrt2SsdsWfR/Iypp93jLyfxwjv2lH1+CqyJbTM6MC0gz5+VcXzTEGrwO9Gke8EgKtwum89kn+YefpvfisNpim23fQ0q+Lmtf2gzs/VUXjCqFN/LzOPpsY/3P5WqWIptN7w+f2YGixxkLg4t+GnW+15v5ScPgX/RnKwtpyCaIfczcOgE+2y/hUJQwV+tVZXAX/6pUVvn5/GdyZGjymE/0mu7AT+ftbKbmfiO0IJ/w58SFQndxXt1rvBai35C3k/cLbOKPU/hwPyDhUE/GG1YBSQdtK/DCCr4K6VMK/Tt57Xa7KkFVlYeM1DnHGRADyPhh/GpcgcM2Oed3e7xGHDdojrx6vNSk87VXLv4ar/+IAbuUEIhv4MYGjF2EjqLULHJEkTwu41YM3Gc2nhGRbZtkWhvpmOQfScXu2CzW1/7MVA49B42Em2Wyrprt21dv278+d2An6s5rfTo5ssUWmF39eUtB1cabb+gdwlBBD8nqpuVn6u5DmUd9Og8VkDMI4QyVHIpEGjwdeOyOln5rSr7uKrT4KWz1QjgYcc01wrzglqHO4LXtvfjmz95xtcuOjHysWo2y1WdQSrqzc2XuyP68DOysdUjg5Xry5o583MLvPnNOAbTH7XS0xF7tF+/r7M/wI0H1by3nCadEXt4n03/dD8MWwLMrqJdUwZPFAR7DIGg80cWVmYM/6sWjNkeWmgVfnqkWpOeyYi6jdhTiutBBb/ur9ak89/cytdjxB67iDXSlyWwY7/h00EnIqeJQEMPfrvEq6f6QQd/PfEiiGONwB9ErnjUpwj8HhGyRpuJwG+BsdQvDOYNdHTIMDoLTSw05LGbNow3DbxxYFHf8xmbGEa8OWX8vx0f/sI+ReA3fPnpAajv3hkCi16BhYWadrspw1QAj5ZjLTxpd89CN93GJDPsBjvIRwT+/CzgddnAEaGCd/QfMUDMu3Q3br8W5IrlKtqHXwsI3lpo+4TSZ/5+XH/nJsvvYMXW5hQGdPogC0/+24sm4+uLmyzU9K8Kr8voAUig0wuQxQmg/eqhFhQ6wIf24a929J+6BL8yjkkbATyoPXWyYvs1UZy0q/34O9skGB5M5yPoeb8fX/mBNfCfPrUV3/rSx9FxfAN+9JvX8OSLeyx1xclVn6WGS1SiYQxXcXU3TkOZKvgHuOl/4bM6sAd3DBQElQ7sUfPgV6axyp/fAHqtpu+eOCG5Mzg8cAjf/2X5e/5kPIa/vHI2/sNlpyMeP7odfu7Vffjhg6/g8GA+iWCJGe8n+LVfP70j6aJdrfx+XoHdajs6sMf0rhxmn+ifSXJNgp8rOyeLH0E8rDIwCPXMLPzOnNGO2754DqZ3H1e0ux8OZfDj//0a1v+/XSWH4zX4dcSerbvrB+xmc8WvoB41AX4de2/fIa7wwrbSzYz4Yf29FPgbkjFcd9UcXH3paYhZiGT24tYDWP0/X8bBgY+aj7oFv3FvHcfO/YYRi13FW1h547TfhUE9KBTc6A1CDX4CfdvueN1s5e1OmKHhUaz59dpjHjv7tA7c9hfnYGpnPjywxUaHhjNY8/DrWLv5/WOeuO6KE/HFC+0HvaDVGs183cTis9j1mq5GAUB3XifWkKEFP7f2m163P+lqeiYUGdzmV97Cc1veREMqgaUXnoVvXHOyKxK81HMQd//LK3h//xH8m7ldWP7JNpzdNWyrTa70D23O32PaejKqXIwC3A0sv9RenAK2E1rwVzoyria6vnOnRj1ZEEuEEXNLRfZhPfrpFyuFvvusowN+pIcF0mMW9uQ28MC+MxCJl+XVN7baBv+adQ0VX/EL4+YXuvxqN+BiNGG9wpRiE+to3339/9qn32tXXSv8Yp7Day4ur5yd2E5owe/GpbccMekU1NxghMBmRh0N8mql89Y+/OkRw+6AR52xjCjq0GQ2SazmGzBrp/B3u+DnnfzPN+atmuy8yEJdOgXR1l3ZvLdLldmX4HZzLrbw2pJVVMSfUUALCSqheU1p1VPP7rsjf34bFCPQOTFaW4y78bC5+ypF5wAt2IwdQ7loP1aiDdsg3XhVu+Cngm/NurwZo5MX5p+hX38X49xPyimgOznzuni960e5S+jtj6O3zzBI8kIg1A347QbGpDXcCe1GAA8dtcc1BwPYAHcGyojpiIA21Dt5ssRJk/2JbmMX/CTZj9c1FHVNLUVOBqpgpFoVvz6EQLc6TSgQuEugH//OD47mB7TyfF1t+znJ//hWeYUfz7jap79a23YrjAtzHSfgt6Lw42SutyAeE+cBjw00cKJQKKdHcBKYlO8K7ZmfnacAIHH0dlcH8WDUHj8DbYYZrF733Qn42QcKgMe3JMZ3ADyvc2U/Y5oRpisqx1JAB/XYsT+Gnr1Hg3rw+LPonDq76osmRzAo4BT8weh9ffci1Ct/fbMuGKOPwB8MPjjpRQR+B1Qr9O/Xj1O5xus4OyURN7LphlkfETbw69TehXzSvv52eMdzNvMAVOsa0U5fS9WNwF+EMjoWPq+lMllgaNjw6x/LSF9Sbp/UmcPcGUZykLCVoIFfK8bo8jsyJtB3JB/QQyXS8D55htNUWUHgc12DX6/gVBwygEeaiTDS3k8QK4y2kvJbt0NLQAYupZBiFCDtz8/oP5Uu1QK/XsHVfflhw7ffD3BboaedsNlcUF7dEUffEYH2FmnYKrRXJ+JP3YB/YqQeAicoUXr0BPvM+ebhlxmAZPPWpNqRTCzqGNHKiWQcJ46fYIJsZSLbrVMJ8BMwOloPI/UEKUoP6UXb+ls+Z+7fwJup37+YUjuSiYXRfpQNQ7tx68Hbj0af3R9qGvycJAziQSu4aq3odsB04ZxMWStDrvhPbikO/FLv4W6Alou8+uxoPdYfwU7fStX1A/w6iAfdfBmvvloruh363LBsuOz5nwLsZxsbigK/1HsY2WfGZEMY8ErPa2FQU+Dnan5w0NgGhjFiz2XzM2VTh+06EMOW99xlJtZpyrrbsqAzktviFfi5sm/bE1cx+MIYmsvMtPb5bQlsfCXpitwqqMeJFAZZtUtwW0IP/n19MfQeEtjXF+4gHjRQ+uTHMmX5yW0jAeJV4THhhEk5Zfrr1K/BDfhf3ZFQRlphD+JhJWPOpjeSePZN71zQeUzgjoAJO5waRYUa/DTvDeMKPxG8TUmJi+ZmTROGerHylxIcBD+PHXaLE/CrdF1Pp2oiJh/9Dq5bNKo8CMsVL1b+Uu1bET7Fng0t+F/fGcN7vd6tgnYnfWH9ciG0C/3+JwoqXu3RFPmkyTyLW9vGPbkl4Zui8pTuHM6abs/f3wn4rSbqdMMTq88SvEzrXaxQE9+YMn7Tvvq6XkMSyvfg/JnmSlo+w3wBa9Y32jrzWx0D611yZgYL51rri243tODf8KeE77H6uCI3NRrJM6g40/79JJ7TbbIdhhara2j7/Rk7jwFLzrU3geyCn6v+3Y+4d+k1o6OhLT/qz9+YEqCeoyGFqrn/0vbg/mfsKf3Mxql/5zHghnpJ0e1lMA8NcgKaSjBabTE5RpALjwAHPzT8+b28srRy3VhIF7vg9zqYB1fu7vxdOd1+qxm8w8p84Q6gZ29cOTYxuIeO3GTlWbM6ZkrHic/X3cpPoLe2GJF6DN/+0uG3zIgdlN91+C91paluPJwpP3l8WXKuvXO/XfCTZqsfcpbhpzBSD4HelY/WExQ+OOkHhQHzEew4EFdHCxorFbMDMGubx8sbl5nbGhS2E1rwW9V8c0LT4OWESQbYg76imzHZ6u/0M1B5Cz4U2HfYmjCYNTWL2dPsudM6Ab/VM7+2n6c2W63qJc7mVmkSlnpG2jHaOBgCwYowqKszPxm55d04dh38qDkug3gow5ZJR1NXhYXxfvWTugJDEByNf1D4Ll73zT/VnrKPzzsBv9L2P5UqGrqKxiyzp0njLrvNniDyi3bVbpe6gp49CWXwVCxr0dkzsrhqgb3gnRxTaFd+zRBucXXGXJ7XCXqrmvNqM7Va7+cxQR8R2AfuiJwqMJ2AX4/7lR1G3j0WGq3QSy4q5SnAY4KO/8eaM6bU6T1/NFGqTwE34K9+7+u7B6Ff+YPIPmrfS/n288qwlvQOtQZ+FW67RL4ElWq7hvQOEfhNpIf27dfBOpRP/1DMF99+uuYmEwK8vuInBQVtDMoZEVVb+AUZ/BrIOliH9u0fHhWeWxdSR6GOL8owyLguNq4dgyswIvCD2XQEBvNXZPTrz2SD6RhEIUB3XfWZ128YbrvVs0moNvipGafXn/brH87wTBwMy89CwUy3X+YYaEwA3ZOo0Myhqy1nahbsp3CvO/AX+vVT6cUsOF4ayfjJrFJt8xjBoB7KbqHJSEJSqaNFJcEfdL9+J7xXfvwq+YghECq5U6h58Gs334MDRqhvrur1UAz7BsN3wM84gX6Cn9t2rui84griau7XPOIuQSUp6cr5Giew5sDPLTzvRQ/2G1v3sK/qXk0w7gSUMFCmsN4dFbwEP1d2gpw+/cxaM5KpD0FtxmPtvksDrOmTvTsq1AT4mbRj3+HwROwxY3YlfqdykccEWj7qzMNO3usW/LRzZ8QeWrQVM2Bx0qdaf4a6gjMoCPIRfpyON9TgZyCPN3bEotXdKffzz3FXwOjBTrIcOQX/828nsOn1RLS6u+QddwWL5mccGUiFFvwE/ovbgqfVdcnLqj5+3qysbQHgBPy07Fv7gs/RKatKycq//NpFI7bNoUML/k2vxSsalFO7/fJajZ6ALNw2TyzUuptp2qmH4C3DxKLNlAeGjOvH9LBAuoTBiR/Ti0eBhR+zZ2LrBPx3/baxoiu+DtjBAByMjqt9+yfS0Io7sLpazJskFz7PYwuLDvpRzljID97VVZZeL/35NTMK3X3pJ0CgWwGzH8wsbFMLCwoEOuhQOAwcifkiGMLmzw3k9vgAAA13SURBVK/pVOjXT4Umw2oFweVXCws6M1ERbdjlW/PUszuv6saf3y34GTCzuSHcfv1KGAxpJx1gaCSGwbQ7Dbnf4Pciko/26+9up0VdNhAgtwtUlXSkz3DdZVAP+vHTctRpofvzLZ+tE3/+zW/Fx1NzWyEYwc5ItW482Ky8Jwh1tKcj3XftCANq/S+a4/+2/8frGmxNdLr5ap9+p5Fqg8AXsz5ogbB1t+HHv3/AujBwEsQztGd+Gu9QAJQy2uEWnkDv7jDut6tpAmvGdD9/5+6AwoDhzVXIrxI6BBoFEfh2k4Y6OfNz28vovaUcaLiFZ3z6GV3GdZZZZFw/6VfNtikMDAMn4yq01M6Aq/51i0ZsOx2FFvxkCs/CPbtialKP5QxLNlq0MYiHmdKtmkyt5rtJM0b2MSweY0jGDMXl7JNyjmjmBPwcPwUAr/p2fmCsbjRemT0tW1cRe+zOA8PiMY4d+4WiG0FPS8CFczO2gc93hxr8dokX1feeAk7B731PohbtUiACv12KRfWPoUAE/vBOiAj8DnhX6AJc+Lh2By7XpPLAKxG2nh55zA0QpoAfYQN/oQtwIZ+Y35HuwOUKffTbS+Q31IrIarvp2pnOEfhtUIugpzlxsaChNpqxXFW76mr/fT5I5WWQgnuEBfxUnvF6mL4ElSjKNbdFjvvv83xO+wP1GZDApBH4bcyEUtGCbTThaVUKAgoInWjEjYOO046FBfz3P5MKlFuwEZ3YEAgUErzOrHSpG/Aboatj6trr4EAMmayxis6alrUUuZZXi9ROB73QRJfmxzxacHx+C4RKgF9ZxfXFlIZbm9FSy33+zIylDLVeZwnyaw7wyEDzYwoEHiP83iHULPgJcrr6qsQVg+Wt3uafksVJU8rHiGcbzAoctlIY1INGTl5fgfoBfoJdA90siMdnFoyqNNXlyvNvJ7FxS/h4p4N6KD/+KVlH13nl6FIz4Gcs+t7DxspOyzau7FYLE1ReNn8MyTLHwbCCfyINdFAP2kJ0tLo3fvIC/EYQDyNDDVd2Kxlq9LisJKisFS9CjnX2VCPCjxdBPUIP/u29ArsO0MPPnU07c9ObJa6oRGZgqwLLq3o8Jpx6osRJnc6y4zgFP5NPvPBOAlv3xLG/z7oZa7FxL//kSNntP5V9a9b5kx3XKz44aYe7gXkzcqBpr5MSWvBzpf/jmwnXoNdEswL+Wo4hQCFw4Zk522bQTsDvda56M/CTx7Wy+hcDOXUFNO+1W0IL/i3b49iVNw21O+hi9S+bl1H362aFir/t+2JgHP+JxWznoOszoUex53WOALM++PU7V//5p9k4LznM1Xf/0w3jZr1ux8KrsxuWDqtY+WZFmxSPjB1bU/v5mz3P30v58+/8oDJXiKX6uOD0DBafM2FgJgMKLfjduvQW0uWU7hzOmm5v0luZKE7rUAhwZ6OExAgDe9CHX2AsI2x56dl9fyVSdHPVv/t3zlJ0FxvPgpkZLJ5vb9LbpYud+spXfxToywf9GPfnZ6IQG156dt7JulZ0HxPbrGvwc7Kf2k2HEmfnXbsM8qo+BQH/+hnUI//dq5DkfvvzM6DFz58oYeJog0Bc8c+fmcXCucEBvpXuUziQBlRO7++ng453O4a6CebhVPmm03fTdZXebOU0/FaYGZQ69NbjKqPsGfLXnHb7VomVn31a/ZCzlZ8absOv33lmWrs0qUR9CgSGBtORfpwIBAY4uW6xvXN/aFf+nt0xbNtjLjU12OshiMfEiWpcexpGTVaCesyamrW9C3Ki8Ht8SxIvvG1+787+zFCAzyrDl3oq6tpzv+HLb+W4YMXeoWa2/RzI6zvjeK/32GsidY/NIB7tRtSeWlnZ3U58lcxECYLiQT1O6c7irOn2jz9OwM+xFBMA3I3NVoC3L4Tc0ifIz3NHR/sHbQsx0Q7CibKP4w3tyq+ZRaWYEcxDovM4w849KuYUMNKYCSUcKSSdWv45BT97qCc1v9Nct5bSX5tzwHkNHdSjIckjkHO6hR78zkkYPekFBdyA34v3R204p0AEfue0i550eM8fES4YFIjAHww+hLYX0cofWtaF/8wfXtLXRs8j8IeXj9HKH17eBaLnEfgDwQZHnYjA74hs0UOaAhH4wzsXIvCHl3eB6HkE/kCwwVEnIvA7Ilv0ULTyh38OROAPPw+rOoJo5a8q+V29PAK/K/JFD/ft7kF7QzoiRAgpEIE/hEwLUpdH9/cgFYvAHySeWO1LBH6rlIrqFaVABP7wTowI/OHlXSB6HoE/EGxw1IkI/I7IFj2kKRCBP7xzIRDgv/riLnx50dTAUlFms8iMjKi/7NgYZC5n/MkcZFYanyX+L5c1YgOKeAwiFocQAiIWy38a32PxBGKJOGKxhKoXi8chEnHE40kkGlIQcfOgJdUiXtDBn8tJZDICuZxATkrIHJCTAjJrfPJ3yX9LQPJ3fgdUPf4fSywGCCENngn9nZ8AA8YL9bvxHTHmUgQSCf4ZzwS1/OAJiSe3uuidxMNi6YrVrsKsBAX8ubExjGmQ83N0BJlhA/DVLLFEAomGBiRSScRSKSRSDUooJJuaq9kt9e4ggF/mpApuyjiGuQxUwhb1lyGIqwu+eAIqHHoiIRBP5MaFQixW3X6Rd3W58stcFmPpNEaHhpEdGR4HuV6lq44oGx1INDYi2dCAOD/zf/GUhTjWNt5RrmqlwZ/JSIyNCWQzjHAskBkzQB62EuPuIA4kkxLc2KWSEsnKsU2R64dPSGys9sr/+U904UuX+7ftHz1yBGPpIYylhzE2nFareS0X7hRSLS1INbcg1dKMZJOzgJlWaOQ3+MdGoUJhj47FMDpydCtupW9hrJNMUiDwyJADZTi/+1X+7kmJDW+5aN2Lbf83P9uFS87xDvzcpo8MfoiRDwfVn8zaj03ngiSBe5TCoKGlBcmWFjQedxziDQ2e9dFr8I+NSoyMCoyNCvWpz92edThkDXGHwIQkqYYcyDbqH7wqv30JuG+zixN7UMA/OjSEkYEBBXau8FEpTQHuBBrbWtHU2uZaEHgBfqpUhocF0mmBvH40Yl8JCqRSEg0picYmQ4/gpgQC/Dcv7sAVF023PQ5u54cHBjDc3191pZztzgfkgWRTIxpaDUFA/YHd4hT8o9zOj0SAt0vvwvq8UWhszKGpEUg4OB78crPE/S+56IEXK/9/PK8Rf/GZOZZ6MTaURrq/D+m+PuTCqOmxNMrqVEo2NqGxvQ3N7ZMQS5rH1Wcv7YCfyrrhdAxDaSCbdbdqVYdCwX0rBUFTo94RWOvnneuBJ96t8rZ/2SyBLy85Gc0dHUV7zSu4ob4+pA8fVnftUfGZAgJoPK4Vje3taGw9XtkilCpm4M/lgOG0QHpYgKt9VPynABWFTU05cCNXinWDgwJ/95TE/30/AOD/84/F0DK5E03tk5R2mkYzw4MDGO7rV1v7qFSHAjQ4ampvR9Mkgy8TSynwjwxDAZ7n+KhUjwJNzVJln25opM2DYfB0ZMjgyz+9kAsO+KtHoujNViiQam5GU0cHmtraxncDheDnKp8eAobSsVDevVuhQS3VicBfS9ys0Fhoitw8aRKaJnUg178DIpvGUH41qferuQqxwJPXROD3hIz120giFUdm1PBfiEq4KBCBP1z8inobUcAzCkTg94yUUUMRBcJFgQj84eJX1NuIAp5RIBDgv/z0GJbPi66EPONq1FBEAQsU+MnzOfzrrirf858xGbh1YXADVligY1QlokDoKHD7Y1nsO+Ki216Y93LN/++XxzC1NVr9XbAiejSigGUKbDsosfoZl96uXoCfPZ7ZKXDjBTG02fctsTzgqGJEgYgCQO+HEj/anMO+D11SwyvwsxupBHDWFIFprQJx4eIs4nJM9fz4F2ZthYcu4x8h5Y4Pj8Oze6fVM4mrNvbRnMDeQYmX93qELS/BXzWqRC8ep8Dvr3zEV8G7ae+JWPWnCyKK1wIFIvDXAhePjiECf23x09fRROD3lbwVbzwCf8VJHt4XRuAPL++K9TwCf23x09fREPxLVqzaJyC6fX1R1HhFKBCBvyJkromXSIkfiSU3rX5ZCMyviRHV+SAi8Nf5BLAzfClXiqUrVt0HiK/YeS6qG0wKROAPJl+C2CspsEws+drqpUJiXRA7GPXJHgUi8NujV93Wlth3YLRjurLJXXLT6m1CYGbdEqNGBh6Bv0YY6fMwJORdG+65/T8r8C9dsfpLAP7Z53dGzftMgQj8PhO4BpqXUg5n4vKUJ370zd5xb5xI8Rd+zkbgDz8P/R6BlPjuhntXfovvGQf/Zdf/7bRUMv4ygMl+dyBq3x8KROD3h64106rEw+vvve1qwHC+OcYPd+nXvztPZmPrhIB3mTdrhnLBH0gE/uDzqFo9lMDG1MjI53730+8M6T58xAl/8U3fmxoX2QcA8alqdTR6rzMKROB3Rrdaf0oC39twz8rbJo6zZASOJStWL4KU/1UIsbjWiVMr44vAXyucdD8OKdEvIH+RQ/bux+799vZiLZqG31ly810dcmzkmhiwUALnCYEz3XctasEPCjywaB0SMY/8vYt0cPO+E3D3K+f60fWoTfcUSAPYAonNMobHNvz9yvVmTf5/9Wj/xWbQWLIAAAAASUVORK5CYII=","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/assets/animations/on_off_switch.riv b/11-create-your-own-widget-catalog/projects/challenge/assets/animations/on_off_switch.riv deleted file mode 100644 index 8ae8b835ac4c5bacf123bb3538582771df90d62a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| diff --git a/11-create-your-own-widget-catalog/projects/challenge/assets/logos/logo-dev.png b/11-create-your-own-widget-catalog/projects/challenge/assets/logos/logo-dev.png deleted file mode 100644 index 671a752d59878614a0b355ef7505eed09ff8e18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12084 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 diff --git a/11-create-your-own-widget-catalog/projects/challenge/coverage/lcov.info b/11-create-your-own-widget-catalog/projects/challenge/coverage/lcov.info deleted file mode 100644 index d714c7c1..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/coverage/lcov.info +++ /dev/null @@ -1,208 +0,0 @@ -SF:lib/main.dart -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:36,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:50,1 -DA:52,0 -DA:54,0 -DA:55,0 -DA:84,0 -DA:86,0 -DA:87,0 -DA:88,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:96,0 -DA:99,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:111,0 -DA:115,0 -DA:117,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:122,0 -DA:123,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:127,0 -DA:142,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -LF:46 -LH:1 -end_of_record -SF:lib/dynamic_link.dart -DA:10,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:20,0 -DA:21,0 -DA:23,0 -DA:27,0 -DA:31,0 -DA:34,0 -DA:35,0 -LF:12 -LH:0 -end_of_record -SF:lib/home_screen.dart -DA:7,1 -DA:9,0 -DA:11,0 -DA:13,0 -DA:14,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:19,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:27,0 -DA:28,0 -LF:14 -LH:1 -end_of_record -SF:lib/l10n/app_localizations.dart -DA:63,0 -DA:67,0 -DA:68,0 -DA:109,1 -DA:111,0 -DA:113,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:123,0 -DA:128,0 -DA:129,0 -DA:133,0 -LF:13 -LH:1 -end_of_record -SF:lib/l10n/app_localizations_en.dart -DA:8,0 -DA:10,0 -DA:13,0 -LF:3 -LH:0 -end_of_record -SF:lib/routes.dart -DA:18,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:31,0 -DA:32,0 -DA:34,0 -DA:37,0 -DA:38,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:46,0 -DA:51,0 -DA:52,0 -DA:54,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:70,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:79,0 -DA:80,0 -DA:82,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:97,0 -DA:101,0 -DA:104,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:110,0 -DA:111,0 -DA:113,0 -DA:114,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:120,0 -DA:122,0 -DA:123,0 -DA:131,0 -DA:133,0 -DA:135,0 -DA:136,0 -DA:137,0 -DA:146,0 -DA:148,0 -DA:150,0 -DA:152,0 -DA:154,0 -DA:156,0 -DA:158,0 -DA:160,0 -DA:162,0 -DA:165,0 -LF:73 -LH:0 -end_of_record -SF:lib/screen_view_observer.dart -DA:8,0 -DA:11,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:27,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:35,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:45,0 -DA:47,0 -DA:50,0 -LF:19 -LH:0 -end_of_record diff --git a/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-dev.yaml b/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-dev.yaml deleted file mode 100644 index 3e0eb9e0..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-dev.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo-dev.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-prod.yaml b/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-prod.yaml deleted file mode 100644 index ee32842d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/flutter_launcher_icons-prod.yaml +++ /dev/null @@ -1,5 +0,0 @@ -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo.png" \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/integration_test/app_test.dart b/11-create-your-own-widget-catalog/projects/challenge/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Flutter/AppFrameworkInfo.plist b/11-create-your-own-widget-catalog/projects/challenge/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Flutter/AppFrameworkInfo.plist +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile b/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile index 9411102b..85198f16 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '10.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile.lock b/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile.lock deleted file mode 100644 index 1294231a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Podfile.lock +++ /dev/null @@ -1,180 +0,0 @@ -PODS: - - Firebase/Analytics (8.5.0): - - Firebase/Core - - Firebase/Core (8.5.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 8.5.0) - - Firebase/CoreOnly (8.5.0): - - FirebaseCore (= 8.5.0) - - Firebase/DynamicLinks (8.5.0): - - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 8.5.0) - - firebase_analytics (8.3.0): - - Firebase/Analytics (= 8.5.0) - - firebase_core - - Flutter - - firebase_core (1.5.0): - - Firebase/CoreOnly (= 8.5.0) - - Flutter - - firebase_dynamic_links (2.0.8): - - Firebase/DynamicLinks (= 8.5.0) - - firebase_core - - Flutter - - FirebaseAnalytics (8.5.0): - - FirebaseAnalytics/AdIdSupport (= 8.5.0) - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseAnalytics/AdIdSupport (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (~> 8.0) - - GoogleAppMeasurement (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - FirebaseCore (8.5.0): - - FirebaseCoreDiagnostics (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - FirebaseCoreDiagnostics (8.6.0): - - GoogleDataTransport (~> 9.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/Logger (~> 7.4) - - nanopb (~> 2.30908.0) - - FirebaseDynamicLinks (8.5.0): - - FirebaseCore (~> 8.0) - - FirebaseInstallations (8.6.0): - - FirebaseCore (~> 8.0) - - GoogleUtilities/Environment (~> 7.4) - - GoogleUtilities/UserDefaults (~> 7.4) - - PromisesObjC (< 3.0, >= 1.2) - - Flutter (1.0.0) - - flutter_secure_storage (3.3.1): - - Flutter - - GoogleAppMeasurement (8.5.0): - - GoogleAppMeasurement/AdIdSupport (= 8.5.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (8.5.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.4) - - GoogleUtilities/MethodSwizzler (~> 7.4) - - GoogleUtilities/Network (~> 7.4) - - "GoogleUtilities/NSData+zlib (~> 7.4)" - - nanopb (~> 2.30908.0) - - GoogleDataTransport (9.1.0): - - GoogleUtilities/Environment (~> 7.2) - - nanopb (~> 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.5.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.5.0): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/Network (7.5.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.5.0)" - - GoogleUtilities/Reachability (7.5.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.5.0): - - GoogleUtilities/Logger - - nanopb (2.30908.0): - - nanopb/decode (= 2.30908.0) - - nanopb/encode (= 2.30908.0) - - nanopb/decode (2.30908.0) - - nanopb/encode (2.30908.0) - - package_info (0.0.1): - - Flutter - - path_provider (0.0.1): - - Flutter - - PromisesObjC (2.0.0) - - share_plus (0.0.1): - - Flutter - - url_launcher (0.0.1): - - Flutter - -DEPENDENCIES: - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) - - Flutter (from `Flutter`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreDiagnostics - - FirebaseDynamicLinks - - FirebaseInstallations - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_dynamic_links: - :path: ".symlinks/plugins/firebase_dynamic_links/ios" - Flutter: - :path: Flutter - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - -SPEC CHECKSUMS: - Firebase: ff8c73105b90e33e1dc6c8e5445d7adc2ccdc7c1 - firebase_analytics: 3b7d92b8d1a3482f557c201e5e46c2f7fa2644ff - firebase_core: 82d486a6231b636aea229bd471bceca82cbe00a6 - firebase_dynamic_links: 0768a32e69be5b6f9af258f8e072537dff6b8969 - FirebaseAnalytics: 96325c1e0acbd2bb805c6a613028b1fe599d6a37 - FirebaseCore: 1c1ca72483b59b17050f5b4cec4fb748425a3901 - FirebaseCoreDiagnostics: 3721920bde3a9a6d5aa093c1d25e9d3e47f694af - FirebaseDynamicLinks: 6e406b3bb669f8c8a63e7254bb63251fa3f88a43 - FirebaseInstallations: 0ede6ffcd215b8f93c19d9b06c1c54e2d4107e98 - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - GoogleAppMeasurement: 8d10c1c470fcb0e5143ed74fddd164f0a0384800 - GoogleDataTransport: 85fd18ff3019bb85d3f2c551d04c481dedf71fc9 - GoogleUtilities: eea970f4a389963963bffe8d8fabe43540678b9c - nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - -PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea - -COCOAPODS: 1.10.2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/project.pbxproj index a859a809..3053d607 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/project.pbxproj +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */; }; - BBB11ED626B6BF050025AFC5 /* config in Resources */ = {isa = PBXBuildFile; fileRef = BBB11ED526B6BF050025AFC5 /* config */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -32,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -51,12 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = "GoogleService-Info.plist"; path = "config/prod/GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; }; - BBB11ED526B6BF050025AFC5 /* config */ = {isa = PBXFileReference; lastKnownFileType = folder; path = config; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,12 +85,11 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( - BBB11ED526B6BF050025AFC5 /* config */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -105,7 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - BB141C1526CFD6C2000800DE /* GoogleService-Info.plist */, + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -121,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -149,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, + 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -174,7 +159,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -206,69 +191,66 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BBB11ED626B6BF050025AFC5 /* config in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - BB141C1626CFD6C2000800DE /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( ); - name = "Thin Binary"; + outputFileListPaths = ( + ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Run Script"; + name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - BBB11ED726B6BF8B0025AFC5 /* Copy Firebase config to specific location */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -276,32 +258,33 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "Copy Firebase config to specific location"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#1\nscheme=\"default\"\n\n#2\nif [[ $CONFIGURATION =~ -([^-]*)$ ]]; then\n#3\nscheme=${BASH_REMATCH[1]}\nfi\n\necho $scheme\n\n#4\nGOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist\nGOOGLESERVICE_INFO_FILE=${PROJECT_DIR}/config/${scheme}/${GOOGLESERVICE_INFO_PLIST}\n\n#5\necho \"Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_FILE}\"\nif [ ! -f $GOOGLESERVICE_INFO_FILE ]\nthen\necho \"No GoogleService-Info.plist found. Please ensure it's in the proper directory.\"\nexit 1\nfi\n\n#6\nPLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\necho \"Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}\"\n\n#7\ncp \"${GOOGLESERVICE_INFO_FILE}\" \"${PLIST_DESTINATION}\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + name = "Run Script"; + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -337,233 +320,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-prod"; - }; - 249021D4217E4FDB00AE95B9 /* Profile-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-prod"; - }; - 97C147031CF9000F007C117D /* Debug-prod */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-prod"; - }; - 97C147041CF9000F007C117D /* Release-prod */ = { - 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 = 10.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-prod"; - }; - 97C147061CF9000F007C117D /* Debug-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - 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-prod"; - }; - 97C147071CF9000F007C117D /* Release-prod */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-prod"; - }; BB141C0626CFD1FC000800DE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -611,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -684,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -759,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -791,248 +547,15 @@ }; name = Profile; }; - BBB6099C26B6B74C00182666 /* Debug-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-dev"; - }; - BBB6099D26B6B74C00182666 /* Debug-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - 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-dev"; - }; - BBB6099E26B6B75700182666 /* Release-dev */ = { - 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 = 10.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-dev"; - }; - BBB6099F26B6B75700182666 /* Release-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-dev"; - }; - BBB609A026B6B75E00182666 /* Profile-dev */ = { - 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Profile-dev"; - }; - BBB609A126B6B75E00182666 /* Profile-dev */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = "Dev - WonderWords"; - ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev"; - 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", - ); - LaunchScreen = LaunchScreenDev; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWordsDev; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Profile-dev"; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug-prod */, BB141C0626CFD1FC000800DE /* Debug */, - BBB6099C26B6B74C00182666 /* Debug-dev */, - 97C147041CF9000F007C117D /* Release-prod */, BB141C0826CFD229000800DE /* Release */, - BBB6099E26B6B75700182666 /* Release-dev */, - 249021D3217E4FDB00AE95B9 /* Profile-prod */, BB141C0A26CFD23A000800DE /* Profile */, - BBB609A026B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1040,15 +563,9 @@ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug-prod */, BB141C0726CFD1FC000800DE /* Debug */, - BBB6099D26B6B74C00182666 /* Debug-dev */, - 97C147071CF9000F007C117D /* Release-prod */, BB141C0926CFD229000800DE /* Release */, - BBB6099F26B6B75700182666 /* Release-dev */, - 249021D4217E4FDB00AE95B9 /* Profile-prod */, BB141C0B26CFD23A000800DE /* Profile */, - BBB609A126B6B75E00182666 /* Profile-dev */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 240137a2..271470a7 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-1024x1024@1x.png deleted file mode 100644 index 945ed968a64cccb6857eca604815f7fec17b4239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68393 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%0D<}o z>-TI~id(4$eIw_MogY!kCK#pz1RTs~uk5AGn5{q)aY`$As@sc!bv8Oi#d#_mvF8iYSx36B-p zZy1s^^r%XWItm6BKkLctR5MIg7FU{H;P|a9in|pAQixxs}ICt~Q zmk?qhiv6Xbwbs|HMqfmdd05y>E8FW6-T`_FhE1r2SUIzC*O8W6{|Ab z*i`(ruxXB1%zwi`UZgy^{8WSchRc zh%|x=7#n2&GO%hUffF<=Wr(mkrrZRgVCq614FG12j0 zhBc@v0CfYZW|$+A!?c!f98n-9lgR(VfRlzSQdZi3Ub0K@tg9Vw&ACv_S7$lvYo)LZ z%pBZsd5s11tEzmH7e~4*sa2!0#Nx0ys4}q*RCKwFvn~$46ME&FRW!DN0dXM=v5v^oG~(Os|RiCu#GgPMZ!C3oD}Vsn&UD^l_0aNKIBXR|9&!Z3J}W z^(zNVbf(Bpt?#c~=oklm*f*QP0Ao-MDlcBa%X1$UR_-D9%?LP~AhIK7m}fMDpEr5GsfnbQ0^BmI>l69SA6 z+WP^lOCmU_~%Zbk?Lk0I^uAPD}%*l=Ct*--F@Zatng3GRk{K$QWH;dgz(?Vwh5f zx`|hOdq%>fS4Eyc<`8rz1L@4JlQ*_vd>gtAr6b*@kVc{L9OZ*niN939&((AM)$OJC zIe6`|YtJ*I{3TS2zb%3qmfBKMOmiN@F*x*hjQ&%e+K*{c=-4*s$I0^+l6O-4}Do!DJ9#=tJy-qg@}i}=&1<;e$b~tS)_@fwcnVR$y^&7yPS%;o+u#3G={YB)|3L zY&b1F%^Y_7Xhx4iv)T>`|f5cEd4IdJpgWwBms(HY&lQz(UIkwmSH&4Jt0? zW>DN)FuXS~6gmtz62>KPCGCujyd0eU9#xs=E7546H*;x0b&?7O+FQn!r6_K`M?-(3 zBpNkFf+;qnErHpMc2ov8L}UB0<)HV>x9aK750&9+q!AR^e}zB2AO*}_lFnBV>E7=A z%B9=M7js}nD%VTZN#H1M^BV_&ys?f76nOIlY zV5(S61xNCMMXdA(TS44;grCUusZPMT5GxwdN7zrP;;o80_>@>S(DagVv}Agb>R$*b z;8-Kyz$6!I{qyuGAd5qPn`G1>R>dQVo^5&Uskjp-ZyZ*We)iJkz8?c|kH=uA$g^jF zB`KxMZk;k+1{K%$c}_@7JfJZKqhM`)$Cx1&)%boDN^Y?JK@kY+GCJ#zGQZIB@O*;7 z6mg}&>29CCyS7~kx>^KjGsfGyQOB17#})cJo6O~eVebng6b?o-I|J_k`>H%qqlSlve@PK2!K%a)zOW~WCvnqo0iJB=JiVkSdAEnL3 z_V)$JzfsE4SIhlz;-yjzm1~Xf0+0LG$E;6>vL`Iz{KoVi~Gy=S0!LDKLP|J6_9Wd~*)p zEBuQ|z%hCs4xHh9VTNS4zAUzI>Yu4rk+B>^*6&qf*kftKK4Z{EAE)5%zl}^~9xmQp zm&j-*fbNByHx20O80tPG2~W-bSL+k6 zEkApX*coCRYCO)uS^9#rq$!8F|J;Rzxeu2oK+4~lVk-6A&k06T@ryN_bo+yKdH|KD zodCd;B5viNnHh1RvkwqYD)>w4zlCxgc0aT6vVWEtYJxHe6r6rkkC1X)RaA!(^NYHC zVXosWLUWF3Cg0F5)xOYmte#YCv-3#|g}grpQ&1MmrpAZnu`#o4j>>xS?;|=*Hqqr5 zy-E_%ShVoV1I9qb7-%#pLx<5GE_bE&saFfv%brx*>Zg)56G8=cWkJ~q> z`Mz(~>C^1taA<`>IS*IvI?JLYZ64g8D#7jMEVr;5UAI&IWQz2&P4&E+W1>-Iv63{k z*5cI}3CE97*S+lUe_0(6KRFj*67`ad;mHk>%3OTUy7Z(3CbMANUoRH#%H9>yH@;MX zO;&| z4h!6sN`-!T${C-P16PSF0hUr`|q_CDhjmTX~?)?zD z+G?HW#aXg1yc7WL%EkN*##ws&*z)u5zc8$Go6o{OkHu&|9b8@<*KM=2yhw^?J+|Av z+R%vbNqYFC>e^uEs4ww-pIEffokF#FTOBAf@XgeV=2g_8y5P8+){#i`HS7Qsj?m&KLC%Cx*Ophm1W{wd#%mrEWm>bw|ZfF&>Y&x*2kw-7nc zA(7B>KA`Ab~=Z*H^PUlymB|6up#OD2e+#H2eUoo`bBN=YuVG7JgszsK`tf9($;|jBuMq#1U zwg4HcD1*qjTWMQ{lfwENdAB4*lUNGo4&Z(6m`Nv6U!=r(|z zGY}Wk|51!=ncF3YNY=FUhQrOo=2+3UpzK|y7g@6)gO8THFqhORw`RG|%$MApb38GD zz3uTnpJ0SUp#@8cSoeue+q?K5c#(ymj7&lh>z>SB$F-VjgD26TCu@l&Gz(a5uNk`@+taeL2;lb#LgZbe_&R zJ@;I#Ju5@vE?h)yz(3^;RM|S9|A?xR&*wT*e+MNl{zzZ{0_9%0WJ4V`)gm>hmtMwc zFwERLU)I2M;a%b{vtu|pqHD2A8lr$f41_S5y(dhwYfAY3sAgbGrc|s-(vyA_5=sp4 zzWiC1oy!_PGBit!CoTf?K`{;6YifckttG%SeJkVw?YHP1>jfN`<%b75hq|UBsT?%3 zqAot_zxDL6t<6WkApl{_SSUmv7qcVEYSB!gBT&_PvH!-c&F)x$?k)K3%)z$x zF!qeB4)zeyNo-_@DYh+H<$?Mhk=+yGsO*-U$Wv;ot0kzl>zMm;0^OI4*=$owK;m=V zI=_b!r?Kk_GjH1d^LMQ^Y)BhQx37q?w*@+!Go*t>)J+a*9s7kauFN4bL&pjF*&* z71<3vQICIzVI@x)M`>C^Pt?KgKS_auQ56Vp8T1brW^MB3hW9euc}eENdxj&c_i z-d>8?V|EJ4wc8>29v;(b#&tTserLX=*BoHwFlNQiCnuIo`;1Ms)eStb$!{o6JS!u6 zM9@R?r8;xdXeL;c_*&vMUorzj?a?8Rkx6>hXrT7dRXF_qEBt=E@(@U$Zi~cSKo0xk zUlrp&WerQsOTx=fN!vppDV1{9q&YZ1<)(9{(L!`4oPkaRzzYd@#6I7cdAMPFY`bE) z{MoAONqBtG);l}^pByfBj`Qoy&JPbpPsQbxFA9JqcX;bI=c`B2k_#d8`Li}d%AUTX zGle3+QiZQ_bwc6`EOWL2&qWb~ME0=n_UOIe(o_316o;@5pjKvp?(BsIdKzP$Zp}NW z^^6Y2ItpBoufHH)j^~*QpBn!0l-Q3JmBKKa&Pr}YX?sUbzyI)IrM;=8vcitq`<4gh z!lc$su{%TamOQMTN+wRJPUOtMTtI7Fvy{r5^oq50m@W_U@G#MKxCT7S0(MyRTw^xv z`N;l8RkBH8@7S=An~dNxXNdfks~n~aY0)M5vO6ASK-uQxbTOn>eml0q9O&ZG)^2&A zPh!1Pn}&a$goh)mF6Qpvy``LBqi8JH^cgrXOfYJ;UzH#o_fj{&?9giZGwFSP5`MMq zSzl}*_k2F;#iNDr-)5IvcBK3XipS`~uXGsjrmZSj%zdRLQ-v5@kZoRI0lUa-b9=oD z*4dU(Md5>P>xmX39Qfh0eta-Yje4-X>@ee`=vgo|@YLBUT@!-S;omSZnnfk_L;h5M7s-Qd+I03)5DhR5G4kU$d(7S!kIMuR?UA_9HiB9psEiPKZ;O^FVFK!(wK_m zmg#3{-G52DYJ{+8!e%L3?N+S6X=@Q5(RF!T#m^@I>^HhT+N)R%tQ5r9x7bIcNS9;( zS$RgxecxP$pO^Ns#X>XS5gA>CFYy)d*Kdd>WL9zv{8eg#TONECmXwYSTb6?5H8IrJ zjwOWA+!4$g3e5w=xQpP)InbCQv!jBw>tzx8qdXasa7N)mgLoaAZt&};9VyQL#HrQ! z`N-@o*>(cvSWDQyHElBqKtrVi87N1#JRW8$%O`Sh_lF2*1|s7Se4*N%0Gnf6rbbAxVa!chNj`d|Jk0bQrWMrjp3jVqJfV;(KY)G=Q%j_C4t zzXt{ke!aI(ue8@BV7FMCdR_{}baCfAy+;dR`Q8}?=0{|X3ltgQObBKbtQvcf@o+p@ zW6YR$Nnv4HNrJ=p4}>Eh0)166!w+mut#cF1O4`Q9bBF*H_G8Vgci}U>2?S{(Ez|E} zJ5&cH)58vE`}5QrjELX>rb|*KVOD6b8cQJ%44E!HSh$Y?{Ni>S!#-q{)$z0+1(@*M zurj=7Q#pMA{8Q(B%vhO4Es#eeo)Bm#3t;0tVt$OzvTOb#+In$t*M3$fx6HR6Pts3% zySI~D&8Pe5V^KryZYzbg)QSCR7e!ZxcA>{mk)(LpWsi`5Btr2Y!-r7ziWQ-eaYv~s8KwHFdS^z$=o zE>pl@B-LFY2`Xjt!iTq~Zlxu8-}TjMe;?h9N$KyN5B`!P!|P}GVR#hTpx01Y!uq=3 zN!h6&`(_Lrk`O6+s6Ft*u@iXU^NO(;2Tm~X$O;sCEZ`hK7$xl*lkeRHl%I7TdM<~L zXN(Hnh2wlu_Kdaz^p#(9O?{Ez*J}}1nSM4da4q%{OO`kAo8io!B`oj4L3(#+yUWG( z2Z`^iGh~Yo{e$QBvCBL&%MsZTuFp9bPl?pPr@g*;5jWcRfKZ3wAN%j31<$V9dw@sD5q-UDG{!QX~jki~6Aaj?(5 zINAI}Fo|PCn7EtI2`t5Mrg%T?@!!k7wUAq7!$KAb&txduenN&8Yy$4RgkyPLjbg7q zQUb7E)jjyFBv7pWz+`2}Ob_<>_<7*{y|o48r8nBy2bW(hkk2g2)2sIA<0iPLoUU)+ zs}T!2K+c!yDMsbUvHpmaHvSF2WkRLTF&DC8uos6rMW zLvy*5C}^i*J;I2B2!v+(W8%p6iUFK#VZNL3qu90^V>cg&f%O)y=W=dVQbtxoq(kY8 zDus`W`Ip<98liIGj{!!rsORI79L&*u{l&k#3z(P!G&2Lg-P&eK zA*PZd0RJcCwu3f08jlvP9`YI>TYmNRyThKf4ZBT31A7n+Qiw=gMLqXL<{$T8=swDB zHZ{NT84c*y@xP`YGijBRgyo<3XQ0;a$#vR)-hU%~j6JAZCcbt|R~1JxQS~lru)Bo{ zzpK+NV26cf2`zDHrTX3yLsIWze~z&p4H+ za&bUp;9#1^uah3h-*Xv#5%e4_hYP1iXcTP{&11`^FTx?CPfB~z&Q3rplI`v~RtcJqzfH6+-n8ltq8V{1T^J)U_;Q%!}h6H5v z!|y6OX%}A#0I>8${*R#xEFL7F^+y8g3#@#Z5UG?Ew*&V1g>qMy6p=^oQKhes^2y6c)5@8=8{K3$a`9ctZyzRIuhEFI3ycBK9(K zIUikI+Ly8Z=B`8zHTE_^D+YBS8FF-e;ZiZOMlxew$DBU@ey9%T=Hm zBEzw*8pSjM-79y`zDXp0vn2OaLq2zP4K9GOfuPj=Y|QbCRqge|`)-a2w^K(nzNCPrm3Q>N}o+8eeyu5N6 zRBil@ns(v?xxS|+yT5K#sEwXA&obXT=5QVRG?Vu+wph46=^@q@b`?~1)ma9MJ?V|D zSzeh8`GFOfdt}Rvp*TzNK90|$m=L|W9hsigSd=UYKD3hWpN=OKil`f?ef2cW=j*hz zSe|}X>Mw0NbosGJ^jukTM`qxmWRr0LC$D~e|K^P2;(*Dp5G@NvOiY}$P0NK=TVtQD zgXyY@0++LRc1Cc+f#0H82qfk{2K;n7ISReZ7~A*H!1s-3um|u4@w66yvhL;?EL#al zdgfgs*0z-Iq+1+iYW|vg68Pc+QGSSmzcEl`xhEU z%t%<}JF|iTMsd zlx;LzOCr(M1oO1WMpA7RR$3~db_^`ocx^UCHcQ>24x6L@uf4DStKy0J-%EE22q<9C z-CYVOASKc*CEXqON{G_Z4U$TSbX`HZq&uX$JMR51exBF&KX`t7_=UT>voo`^XU=(_ z_spKN@a}huZ?3w}IFbqvJ{}?V5LiWDk@S_NKHU7T|1O&-aqPr^GM1AN5g;rPt05>~ zR$^UgU2tvgY}d^fc4RD}lQL_;rzoTFR+s(RN7L6XF+oBvJNoR-KNADuFo>t9!NR7A z08a2CF8WPz8r46vkIFV67n^sm`9lT$ih+A!P?>R|*24O1s_z~bkA8{= zxemSN)BfZ%<;XY@T0EecA0Xr8>1F;x40#>STlF8fy4&I3^)5+drgCXfe}+u&@_iqaQK|68D(Z zX9^A;jWMSNUCD{&3=Gz?v%~nsG>$7-wmeqNVoyo}wO|y0#0rr(sT}2Pud!J8{H#kpF>$_3xxze-!8G|y`a?H<-!n7tmA9p$ z)xn8LdilGcmW&02OB!hxox)pz5Ws|Z#fdFo&ZPPAK$H6X+D|>p0b7k-DmgBIUJnn> z^CQvEE!|%3DnV<}Jhk-!MOjCo3A*S*m=M{iadfUmGnE6#{C@iw(=i4`6XyQ_&;Y&I zXkKl%&rp^k&IkXJh5ddm1N4(XvaVRG(XFUwU2xj&8CwhbqJXvCqGy2cUvP3iSw!eL zAw*D7qXU0rJ=a84<$BE`1AJ=4f^}d40rwJou_AdLO4qI4;Z^V=OpaH$B&`F?{>w5m zJJEmeP7%9Nl>$2P%oFgxLA$#YKK(YBbR-uyQ&L;V-W3pA*6b7*%;e?x!1AhL-F)-? zgO7PMjJ}Y*v7N2A?hXY-7bm5>qyk9k=-7MJm393pnlVbL>D>O<7zoGqlRa#ZeVU!V zx4RneVRhVWttUPpXCB8%I6V3=kg2WQP_3gqoQl9a1Bf+F?y1<5g%i`ShUC9I0+?(1b;mJRz9@ZP+jfFm4jUkV{=7&L4^ ze7zZ1g++|r|oL_1(9}uJ&cQ)o{ zS#7(k%><~hMsoy3&Gw7?K?6bNigOX-rOMGC&9vWt$g!NAn=VdxX3m}GD&nsBR=3TF z$#pGI&`cq1egl1i@4;Pud%JTfKX^~tixz&pK8!n#8)LJ9%d%l)Em4NFhB?km2zx^1 z#MuX+azf+7KZGyILrNN=_4Y&AE4Gh^rBPvY-CuR^q#9hwB^|d(UqoZo{h5F3Uf7yu z@7zn6e9cX+OEVkDmo5C48Uw@l?q!Q#f$q+{@fvD}E7ksmOfH{_mFzFzK~b^c8vnE1 zotsbu$HeS(w=#j~^d3kxdX;;hcbXJ&teQGjp%u(i+JT1+}LEekC| z&+k^)(Y#!JlN`vN0$QV`>%!lmq~GcXeo4{hqgaBN_)0`?uQKAihWEItlvD15w5L)> z=vv5DYsB|R|27XcVgUO<&UBbMx^#RVY>10Q$$4>;B_B^wza zea9I={E~<+5)*5PI8h(PF5-+_2{`U%J1KE3D*!124PG7W7{Tq(@bb{$<@qq*sw$V# zYez3}+m+a$cYIKKDj~$XGzU-m*Kzxq9uJWw#%(`s&WITDP1XsIIWMCKZtPgN?zMMyEd&DqhB8CDhXy{c@V;nd2WG5^QD^Mac-7U}3=Mkt*MXcaD&peHEO z(U{Q-`D~oBaI4?b*`W0HT89I4j3)9B6jUxl(&6nVGQfLk7#Ey%G1Q`aW861g4RKg+ z`ds)S?98Ze652a75k(0}@+fHoQ|1uTguzrm;^XE}x^r&-H8d6XG)hIc*jgqU8oZ2VwkrUs0hg9B&W;m3(5n}Y1T&S!X9bPoaErSZipCDlQ+{XEaEM79; zmL}^XPTSw9KTX*$es8fJb4&a*^>7!Kau(ZZ3~~1!meIHzT5=c zVtMw{fC9c69m5QM5nQBR1CGQ_-#eYrA}2`?NrD4}%Eb!O9(r5$cSAjMjDm-9db?tD z(H{*Ct`xaq!@)Fb*gR;cs*Z<*{7E6<*i=O~ z1?rlL&nQs;+&%S>92A@hyzLSbNAr4-1-X27c!DEM11QPUh~TZWCQ!tkbQ1%AZU%jJ z=H5aciNUJ|A(ex#i(Uv^H6fimk(ql@$YI3Y7-R4)cZg1tdiDhaUgO@F&?d9eTh(n! zvR6g~zQJ^9PEUUU<=LMC*UOQFPUVa26?dw!u@=TO-(g7WcyQ2oL2R)6HoR(t$&*(1 z@TYa1W_tvsDO(U-_x;8p(4m$ZeMh9Jsy4!g%MVnj!)`~=yMvxCb)YV_%dQ3mUE}i} znAfJxM%%vhA}eTf|8Y&9R?g44V73G0mt&_jRWuygzv`bb_YZm;OKRIm9v+eLx{05RxUW_q!M{~klGf|3$qdp6R0MdjQOJyCb8PP`OI23JZw;7PvqiN+S zAflc-c7FT`8gC3dG~tVcs161l8%^(-6CTKi|NQ_qD*j)id=CK(41jY+fn|qCCyNJts}%`~y<>@8W&W^1DOzK}HU^^QeMho(b5AYx z@B_9S?yeI^PP|s(jZ@RDS3`r^-2nr`6VNLC$5lybm?^Hm9OwugdbO_3pV(Oe&i^aeSgv%FJUqJf#`6l7DOyE^Fg78()&L)(OC_vZrSvjb@IUo zYzvc`4%&E%e>U-1`9l~H$Ak(`u*)<;|Kb>pIkD^f#a6l&IfFz z1>X@WXW^nk+GMz>3A1lll;t3M`O_W9Be z(cA^Gr$n3He3^%O{@ zM^QcEiHb!5%Ym>}lz(>|Ajb;-vm1Vf@aT&DPdsjkY245QZn>>K16)M(S2;33QwS;^ zO#Bq^+mD5P-5}`J7YbLA1O3)o9vR?ujB}ebl-94_d_udfmxsYxjhu~iseyEvP^)vV zwd&R;D4xy8@=T}YW1l(~4I?_!Lzr~bp?Ym0CN7@{JNFg%h+O|O&FHgUzrY8KtbzBn z5Tz!9DlKzx?c&Wyu#Pb|1-O0ydFxq&BXhX+6IBr}G0;uTo#FFM;6UjI|0gN5p;c-T zf$<^F6m^t6<)&DNZ9R3^JEv)Wok+BPe@?<~8%5&;&g-?mcOI zy5z$X6BVoyV+<7Uo(U!C=mh@g>{f?+)8>{_N#P`l8JSl{oY09WQLtym#8_-(Um0CZ zvlU!4ob_U&63L-&u%@&w52Pg0_bnAZ4+?q$5G!}m;K8UkHViN^;0hpeI{y6+tP#_h zh%n<~z%YL}Eox`y`~?xOfb|!kzt<`;Ye`CZ2&A~5URp1dRC#l}m;c-T+Sn7aj0l*N zT-|s(AaNA<^)S&GNRhoW`t04FfCa3CAXz$lggmG(u!sT5r@+InFQXX=s9+&~pGCO6 zir&CiY~z(ph)G$e<59?feg=N?1BwHATYF8Tezm7muYP?LLpP>9x9~61{aPvFz|mii zV`tsI-W0oQG}N`o_^j!Ew}Ab)qiMmL>chl&2qK zlU~S+EfW9pg*RVGGC_6|T#J_={RzQ3{>Zn9r%Oc8^@$80mxj)A`rDn?Sf1Z<-e?wY zsoP?TlXI_e$CG2U@`ZqBcN!#r?x^dps%Ub@vp&5%NayQC^_0`@2~(P|J<%v}H*WpQ zDSd>g6>T?o;x?d2W670yvH$0b4d1cunZrgZl4fy!vx2`$`eh`Y3g|v&qQ!<1ulm2> zJ&x0OSNx&nZ$~Hv87CZw=DKC_rl8w;<6sf}*hgGR^DpVERc4@#VwKZ&FrB6~)hLiE zWB%LIglHjbp{3d)uI-}foo^`$6(9VLp0I%n5>$q8+Njn;5(scsR+5~+dQ{SMHG4^u zcD0K~<&5UFoCT@FL=J~V8LixJ*8sYcUltw-m(?^`YpYeVnLb?zRcw*Il07A^N?bkMn2g1qUJ~Qnpx7@9jHY@b z;I`9C<&Ov3;nE{M$u#0BgtkW&+ZC+?%SQIg(5D~RbxJ%-(D`w2Bil%SR~O5O=hdfv z=C$|GRR0_z{XyMB%fnlK(lBtIYp-q=xhFm2vq1Bxnox5R{q+a6P!Y?upne>~S+4R> zEeK3Q3fyOUu>m;-LsT#_vyebQPcdc6beuv||`wQgHn7qWF zOw(;o`BGt4)COb-sS)Lxyw9x9boI7>q&!j$p|hUGJ(pa)o%L4(GJ797Vv!G36xoxPtFu-s(P8!I+K`M#5`+LB z_3w0{aBq1_vNDqEZ}`CZ$WC7$IgCr<^USLga@fSjySH_fOgTE{mQ^txc}IR9!F z#1eYr?bJn1DS+`aXQHqXU@oycGs1p**oy&t3rhX$n8%5I*la7U|Ji#E4Q4+gtgGZ_ z>r$uZq2f~lew}gcAku|g@G-p@8VPhyl9L|8>ow{**GU-1Gq3j}~%)=WezrK|Rl7m)Qr@$~j1W0;`9>U^lNljR?YRo&8cw>i8V zlTqSs@;gZnmG8#x4zvYo?tFn&8S^e~$0 zI_Le^x(%pK(;lWNyBP9@Lx3q7EFkQc0vt$08H$?QZZ(m#KFb-D9;qIO)+R$8$48NZ z5UF&rk~wj=BV&@(aG7>%a6jK5L-epeIPH5{SE3I+09?+ zF>m4vquNNr{E%1jWz@C0Y9yC`3-y3GzAW9b7)=3yiKF@jE+D3(-#6z{gmNLnO{Vb# ziFC(oUWilAxrcj3WZbt5i17;O*-M5k{_&3#W!+Hjmx2CklNKo+qsXovIy-O}8=y2i==#8}YeR z6pUhCy-cZExQ0qr`4I%Sf6j)cPu2WrNAZ5wjw6HC1pw8KxQSE=CfGrC_^aO?0>w=M zUd~a<7N92bOcM&fmcPjLJB>}X{!_x+u$>`Ub6sm5EAVLwptA*%nx3`mkG$oMAO}2; zZNJ!}!q^iTpA)8TFM7`ET28T+VgvSfWod~rJi!@~<#}=E3j0ddwPbUw_c6CxI0&-+ z=lq8K&+~8I{}IuCi3|5#Cbo;i2h`R4-j||FQL;zezaYPJ{k#~8;*^ml%7WS1g(d6J zI($I33UC}$U}4q;jP;mTLJ=lwe!b$~^v}x9H_hY#&p$PYFBsY_zoTN{_J6}xmxRPU z7evIYX$LKl`tvd?E^k>&gXR?s69eL6-i4N&l0gz)TkG_C|E?Tz6IIeh^~xGZ7^gh> zCN%IssxZN|HWr@4zA$u3a2pIJ`zqQZ(7EI05xA~ z#;eM{ADOb_Oc!U$hE0KSh$8pa9ez<)>|AqxVDC=qw41N3~OFWU^@%o!%~-|`kfv-@f9B^Yv>BG!3StGd^>wN&BUIM>c7(ut8V6l zM~!9>+dpNcWHM|3RLzS&1Um`ZWBLK)37(T4EmTz&4(FYY%0zZX&5>QsIT0JfQ6 zODE5hYzT=U#tvu#z~#phgs8NbqYIJ{F$TRVbeRi{sYVA(Z2?Di!1B!Ob%AghF<{(S zH|`SQUR`+()^!$6md=I0*HPU`clT_a9pKds-`tRi`(%sL{UA7 zOnHD7uV$o|*I?M!@40G8ZfG@eRwARM(k_|_@|p7aHLGR`a+)y>fRtrD(>-Q*42o*j zh2(B#H({zQG>2mA@6LHu=6$b?XmiCI^VCSt|58OtQ!3GOdJ2ELid*AVv#2cPBL_Z} zSR|1IfA3m; zy*hUiIQ#iP5R(Mi8uJ%#`3*|R%HV1N>lP|_A;s7Y!HJVlrOurPOW{|hL9ef@FRG=k z2=5ytH&wlBr`eL-6Wp_e?lmK-FSdu86D8f|ek1MMj_GhT#m+B6`8a^^?o(4QiTtV& zblBb|8|09`lehXkso|v@?aymTem^VQuXdb8OJC*@nN<{zwbJBGIN_9KpPGay&_`n^ zKXOO`dianfR*v4gd}08)W<10PS-L`sU0z9EJ4A}U8WIhZ-Z38N$~qMT`X%BmpNW9B zi;5j6pWhY5QM0w?i{1V1#zjgN@0(%k2YoEQL(^yIs*la`qxs?9FoCQUDmA9;YgbMh!TK6AG+R&cIC{r=mGzv0TSLU_OTNXd6 zT82LzX@0nOrqu_`ZY*KgV?x(=*U-h*bC8KyIFU z5q&&Wm?P>g78>jo&n7lnBlB_lh81$-{AehBrS;VCE)Tiwc5$V)lSNj&OlLT2GPRv4 zKlq?3c=+?W(dO>6RPvYv0l*j!u$8n5FN;5q82Bm7$gA1^VOXU>8jSIBJoX9VNYAoQ z4%B>1dtJjGn}7lrd;*B!6hfzTzS4>*Ubng%AvXSIF1i{uZA(C>z5J8TQ6#m`Qj8{< zOy@@)m84F#|ocD&4owF$Btp1ocs_a@pfzhe! zt~Nan09DK`9vUpzb)zc7E?khk*;Sla?jGio6-H|hmY@^h;IhX zj2{())58+WUuAl>9Z=YmdT-0GKv2j++<=33MO!j7_pY;}>Vj+Hqy&%c=+{FBv>Ta{}zLrvfHMLXGP$`vJ z!H(z0g915)9R39qh&wt89OaOLutvuWRq7$_r;^xQyf=A6Uroo-~kFB@EL)o(5}Hmv%T6QZ1^Jd|F5iLtSJE!gZNj*&~d+V*o(GhNXgxAN4Pvw%XE>BjAAC0T0ZrFJ{ z$bPBqG27P#EQ%k+Bg*+{#hic4M|8$$n5Ikvhk9=3QOl-Ju!hr~ z0PuzKHU9X1448>{1ga1IEYsrb(h*aR^(2aFb-naO@L8?pc7A0*`E&8b*j7C z@ssHL>pP;NcWPGr=<8P3_AQvVMm0(z`pBPyfBQyyRnt6jR&9rFUraI4-P^WoUB;;( zOdv&&RCV9FQI!`rfweBgY~;(R|BQw=s_7zU0UiH2Rq^xW^4st?1s@==>LaxeCFAS3 z0R=nn7oaXTu|O0BCWz~1+q5p_uJdDELG+n$-2aWXNrBKPAGOh8`tx78Q;eF4T29Ma zc?;5zB8&!EAyBB5`JDs77v-A~tP!bPuUT}Zw zzSiHpy|U%dlFRzl^LJP8qV&&H3L153`yCoontA?QYh2XDxbm_C85Q3YnXX>p0_lvU zegkWOC_cnkdH}C`-D>=8x$JG2=%Gppol&gUB#Pd(B0FdWpSq_ac#)pEQ8;Q2xpQ7` z&u>rb5>vBST!p(oZT#_2(o2=d)~N7`veIF(fVTbk&SRL^R4VLb=P?kSarWqwYBtG! zUI8C#sw_6w8DsHW35Qg<97vqhHBeeQ#-R9Onue>s{UA>-TE=(~I=UD->M=fTC0_b` z{&W~(8{-%FS1w_ORBlKn{fo$k8~tl42CKMYcEFL|c3$#Z^1LlxIc@2Nn+fz=#tai0 z4BeO+fYIheeAVUdvD0zUR6!Uawj4%lGkeTfwy7Y%dFnZyjV5}jAGaGMi^WspXhyM# z3v1NvF~;P`#2snO^nk?F&{duBeCguN;sA%g3Iz(hExcY#oLCn^&U0|J!XW$=^js-f zJNa%(#Qd}}?hG@cyrh4wVz^=Kimp+b?+z9{U`6lIPA->fd>yR#AW?e(KPc!beKTH?wA9^V^opwhbvCIofL4kYCQ zG9&>b6WjPD0XwmQc(YLT4i`f|jv>kT_Mx>y1HbbhG?}A148vELOS8FZGA^UVSP5Yb zj*2Im@=4E4c0;7=cI5z{JDwhpPoZpB4^p!M^Q+;cld{n9Pl8<(H zdc)gUp)=ENYp9Z&6W!t(Q#+jJlg%2sVV>t-a>E_Q7>S8!0{*)JgeKneSx zrjWutSx$~&B5KX<)YDYdH=S@3pG&HlHnGCprzp>LMF`K30_RKp31B?bALif4-SH(? zru=O*ai1Jp?TrhMcu|+7E6)RS2IlH5<55h!^5*r6bzZ~BZoY^Z{~3e*lP#zxN?m408GeobYXbU-9H(9^{zRFVo3llGIvSQw3;S#~YXtLTcZl*g( z_^<-&H<^x}ATy)F;SKA{vhBXs!cl0v(Ol44Y2k;Z6v!p_xo*|uSa{+~9=`<|qFOrm zNa>Gt5;w}FN_4uL2)tzXA_CKM6__{(_33Vvg2bJxg}%>+UFDlSk$GiS1eD zNpAv{dcx2LZqq9t9)uJlZMRVDS(Bd>U)T-LoG6;MfR!sV^Juo}DMf07tSmi+f~U!& zBw7P}xM3?lBX5ezYt7?O`HvDlz>UQQ3XF$F%dn%_eO2}&1%`cV+&C$|9Hc!m$pfh| z5GSG3wH%f#UjMZ%;Y^OaxYx_72tf^pj8n~X?1jPe_W3MC{OAgb*1iLxi|xvrVL zyz%6^oY|y5^JyTh??%mVbIfn{*~y;(*H6%E%uL4x^u2kv(OX{SO{z5cZ=a3iDJ?pP znE_My`q;}N5MDhTrjj_dH($Pd&u>cmTuHL3i_C0z@O%H&+}Zipx@p34!xufhB{=%0 zIW>NSp#e;HzZl0x497^%h$)FPNUgw$tZ=QUK)b{Y)( z#>69^bkhebq7i7j@EtuJIh>~{_)7&!tu1}+=P2h`H=dp^x%LyvJ*R$;PlvSK6$;#| zD2)-6E6En*j)KIOz7n+NaRUIU;aX+Og*;&VOg}`N-Ptf=)7H2MDonIU2JC7qzB%aA zse&ISCBDqa3=3dVu9lfc-&r@BZK6LN`_%OUG>Hh2HqudWTMJr=r@>+2hw}^fKTy5& zyCRW0OE1uCJ#)xZK{Ml++^>!ba^m%Q&#Ve7_}#Au$nl9P+?4IfmbEmZ!{>Rv%Yc;c zWfOW<+7L#~+%pXAI9veXoNpcU3Tz|kmrPINj|Z!9;mCL>3)=K)g;+odf>qgCP?C_@ zi{B_gaUN7Owq847i|Z)~tr&R_;xKedm{Ok1dXIbX~5g(sd58RR`|-X+H>haduJ z+d`iJY~A{4soj962+LyS%Ex`l(R z2;qX!)*=7e*5-`VkHiyQhA}7D*1U$z?8~ih}b}YINkL1*d zI&e9$jpqzd?OQ#1EBlp@vU_D7d9Mfn6-v8gxyE!+=? zQy`eD*?S=n+S2NA$)Q$UqXvO29q9vfyf;NR`cW%%bEkiI6N@se-h6rUP5{I9`m?~N znW8zO!VY52{3aH(ijRv3XWyZyfImjNcijjPyJ#l#Si{@*qjXZyT7;cqtMS2snbl~^BtPAuNMi) zy-0qnhR2^%5B0dV9rvK?muPbQ+G-XBhBf@s3Y?+Mo&0`vcum$XMx6Q1OQj|0F3KqMF~y+Ql0 zFqk-Z(Ybk+@YDSz0G2#Ji&vR+@Ao-?La^a^FjXm4YDvaTTd}SK!5)?r2sYy zLd*NVT{MuUOjbd)zG&H4L4acgjutJ5{reT~ipYRJ1otNZJ#ZwY6Vnm@nyLW>>wW3< zO_FHlzvKIrTiiy&>zwQRUQda<@OtB=?@fP!vre;XjwC>Xb#YD7KKWPFmW-h}yuof_ z*QO#fP?Q*;!43!@x^GP5e91R52fQp5+so z$KKP@92a#LV7?^)n8kw_Lp%;HQ*C_i4`F*B@Be|14o0@3=~+7e?`gR2d*DIy?}{xM zc)+`0jsn-0`d88%tk5DQdy$VYJnFyKbpKAGoYd}&@KNCb|86S3FXW=OZKR2$YX5h} zm=)w(J7v!tIK2O5P=Y`02PeEYIN|%}c2R=pKi)r7OZ&VPnVNbD==D4^Faz_~|GRaO z5SP`C00nNkv~b@&coeV4`MnDl#oc;TmWuyRF5JVt%Im!9j=2+&jkTsjXDZu$)(QgD zy@jAx;rZOfj_bZAxU#o#e`)=BD|I!Z+9~EjqUHL60s=n)S0`uoBI@s0%E7lB<-v^s zZ}+;NHKLp6?7l8JzQ~oL^>xP7lm-2L&U~fTdf3Rg!8<=n)G>2hpm>-76Yx>6Qeldc z=fr7-w@&%*GN-CfAXoHThY6Mzum5$~?t-GRi0vZ z=`Q`^nSvfI*N#vc7o&QI{rmvEOe@4i7dzCY!g~9xpkesEV+lWi3QX9Cpu*fC@C=RW z!wiq6mC_;vR1EN(Yyb?>%j(wd#X{2l*NeqQmuJWJd;9Zj)y=8#*Qjo{;^OZ1@mqqe zYZ(*`It=spG#*iC6E4PW#hj*99DhS zGgMMU{cQIa{95&a)}yIGJyD?Y+EnJeyC} zZWL!7=2u%b+Hbtq=kEIF?FA+?_oyR)1udT&-#xN2$?@hVtNT^+cU$(iN#&2h8P%>& z@GdbU45iaU2|^*;dVsz_YqI1`Q&(WVr2M>Y*41%n<8F4**)8wN=*QiG#1n5;2mq(K zUKc;R!R%hRU2Q(Q5X|^HC|S3ycG9)d$9Su&l8UK|*K$rG*kbclLij@I_myMeN4rnJ z;lmSkBn#>k=E)D)vdKHB*dd3-8ocd!^Ir2sS{ipihrk|1?h+uk-3zk@i4;YHFKW?cU_A@-QokkPlPj#qOr2;ZC zy%GKyymZ&JDv?~?e09wnJd)j-`>T_JrnvTP6=GqMYpljyD)lBm(zNi9T=OvRSyxuO zh#2|_rP1`S#!?n}!r4jpyZNSI*^W_qzbP_wSF1C9Dqvz(ezs5XqH&zts4ADiVywCJ z-SLP*E&d07#?=)jzsCiw7+d~Hyi#D7GBTiFH7SiV{9T({zmF;29M>jFa+c5{)n|6k znS&os(q0J66bnVqcWG98DX}li>V7NzIzuKvrN5Tku|ATnx2J8>_3`oU@9OKq`i>u| z;xBw6gGQ}YAQe-WLpukXcIi8QhL0L{C=ABVri%-C7PPg+X??fi5;Yp9Xa*|P_O)E2 zwZP0(t^FhJ3LfvyEaF-W;^(i%9kwDLb>wI3?nI5!-ksj4M?wPSThwg94oj2UKuZ)d zimG!;*{QpXW@Zf*))wioZ8P6ac}4r!y>;Pt@ssneu!x=a6FnL!KD-@1c6z+=DxsdS zD5e!UqA)~|-jR*o1-GjH7Bi*e+`LWGSlbw3P(~;y>3R~U@F}TP-^DI=kAE_Ao&eAY zK0c4R{>G`4;Ws^C)LgDW?QcG%c{`SoaMFfck-#t5kVw%a0v7ZKj6xPBj1m?u$}3pz zGH+15Q}<3MChd9VzMl&j+E?yWeoTDkYppdqf7H73;Fp{YryL)@5bB@j{kwAq+=e+4 z5-tPt#@ZAV#k(VL7q8T3UN@7oF?f#fn#Gps+r{H}!PXyJ5}aQ!t0|Y(jxpMe6?mlz zQ{1}hQV5O$Z|i`R@XMs>nEpt;0I}WMiTe;8wey9gs5HfbdN)i zm_p&xw{u-%sg5Z$@5-$@PKh^&K-*GGpC3I`1JQ z>oY7i`&#AdIb7x7Bm@K_`^f`|QRYJjcU)1Bt19Tesdf58P~XF_Fk(-I2BSCwPtB9M zK32(sZD+A!jGlT$hun$bsY7EpQ7pp1lTuoE3|lUecRNq~93eTTXEZ z&lzn`pLB`2)sP<_!8DH@A5vajJ|IJy*?DJX_p>S>kNW9b`2*scM%RK=gAuD;Z7Q`} zwT-TBj9|6;;ls`u7t0lflVsz_6`@4mcet9zP~^7uT>s=u?N) zZq?F%v1l}Ux75|vBR1)yt}ZcwO%AMwt;v+9W_~FuI^8mmAaryY|Czp1)O6gqBQ5{| zuxu){6V|J4&)#{g4tQMZ&TrVbreL&Vkpl{3URjrO`r_+X@2RgHWBsqA{rxlT?Tt>l z0YJp0;t}l5Evf5$nzip>JCh`X$jt=TGOpX2qgiZ!(E5% zEi~<*=d86LR%t*uW6f#a{;)w3V(gZ=q&Ao{aCR`VH^75Y_dEBock`H@Ke~u5f6n3$ z3_`%cN@VCIy9D7eTDtw9n?0y&7^-|dz997rzW$j;IVc_JnsvS4FzUf~oidIIA$mY~ z;sftU<{Y8D6O)XZ7S@vjgkBQ^`ypV26T=OBPkPxc z4}OIWVCt}iRIbr5y@cs56(%x5F6V|wt56dbz6GR1N@m^a@xy9w7G;gWaQW{C~6MGdP6* mGjaa!=YI<1e`_4Nkq~BPTFFky`d{~hE-$MrQ~JU<;Qs+zT%hFu diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@1x.png deleted file mode 100644 index c8b143b232bd394e11ae6232f8a401ea57a7aa3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmV;00($+4P)L(z(8ygZ=sFRxuRAha!(Np2G5XJY7LgCypOQENBN4cv4*0r!EB-`d|`F zq|hIN80Fo<8Yv#+m;M^z@`LPaHdE8Jhq=Wk`L}LN_OW2rZmC!gr&oD}WTEOk65SqLhD8W99g<;;Vl7ap fdT{v{AOEl43bEaG&wF-y00000NkvXXu0mjfZPO)7 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@2x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-20x20@3x.png deleted file mode 100644 index 28e0aeef6e555233fa2cdcacc350b0518e3f51cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmV-#2$1)QP)?o2k(&m=Qc&?0kq8(yF=~uacu~*?AAI8hqcJ4L#0O(y z0tyBb&}d3P6vd(#Q0^3Ii@m!o+soc}c4z(1nc3Z$otb4ivqkXBc5`Ot%$#rj^WV2N zxC3GPuL&4|8fmu!SUcD(Q0h{-8sWengFqA_@yRBq1vzOXx}g!KPSJI%KMDhW=<-3& z7{vL>Ag2X6X-^?x%vyl8lEXw2IQ;NrphTgQeCAb^e|R1-V?sVo0vQ&1S9 zz)3$CdRK{qe4+^$h(IU-jg_K-P7dUx(Z^XR4`Xmzp|$|JLqy~Yt8Nu(pc>2=W=(G| zbwDr-F1s08xuGO&`jNbvf6OZsq$i}%st8eY90{9!jyCcwY4qsh92pFl4m35zP*+A? z{`_Fp6**}PhbBo6MFG7wmmuE53>qq-xi0n0U{ta028S*{YIZcbIkQ~!EVi*Q6!srA{~lDPZ)%7j=P5>j0vDO3O8cn;niVN zsnY#*B;^uN;UKwYA)OfzVZMnR12}{05BbpO%#U<0lvD*rTaz469W9-pmh%9}&pK`?{;SY`Yhb|0D z7|5ygD`tqnkD+4D+GoAqLl1-n0s#_G8Z}5`@*pqD#JNiUpzLS2o)Eqafv$0P}eJ1ZMwC9FDXP5i(r4+OQ`LDInqd|iiHkpk(g4( z6CxFi!v&Hjqqixs!zc|&=u%MFg2n@F!P#^A+5D3RYLTcU|3ovn*fb|`JyzkERguqpS_;%WRRK$Z@8)p<7b3+7T5$Qz<_k#bDYquIJ%ma!tANBB ztM29-PF7?@xBQ19q1&w=yq;=YZ9CFme7lUvnlV>E)I47njwi z51Xei-q!Hs*0$Z>_5Y5C)ogQkBB{;k^7WMDx_&$~tZE;yy{nmyJTq3^f z?C0w1p#%jPR!oupDq=)EUODmpf$kHHMK#FynK|n|S@l*+>-P3>G5HL}LXRJNM>@YJ z;Eg7@_qcGev#_PA>F~g5;ry0aYw-I>-|yb2M%RH)s@j;GG?q`vo4-bas?eqJo^8K< zSjm>Gt6sXJanmcm?oM6h&-zq~+;6&1K0RmcQ?;uF(l*Ajv34~MQ1&@iQavrFh$Tju zT8gNRy`A49={26Fo6h{A>jxzL@Qf8Mi#^P94|tZ8yNU-xH;xRR(YzA8iZEFBJyr0)xI;k0zKu>bmxuP@lVzIyqybuH*O+Xl~H3k*zb zJqokIWy8$-@cZP@Wj&Lx`uk50w=bJI|LvydfSBM>y~{*6>5(b*cy3n9qc!*9;InJ3 zI&VP@LDFtV!FViqsOO~KmHe{e(g^A2>mOR}S+uxh_Tq}Uc=++V}%j;a-kdwyJLx-T7Jx$F(eB4D}*GHER?)&?= z^s2*Z&x(r}5!0kcxnOJWsV8bz?bV|j8cB+r^hgA%i%9U)NWorh+wHOuM~;Ty8}N>B zvN{=kMN8`rpRo`pk&&E~`>Kr~}b>#jE4J>K7=&iKuEU%)*uN-YYqu zqk>$97^l7#gQxkQK#d_u|9Hv)^SfZGV;{(2h$FO9*cqfrI;}?-Ds@IONMm9@bSTfz zWGI;$@RTc0+fiAQ6+iyUNq706lqEHpO|5#<`M*s{gt_d7m`?cVzjs~oW}TLk#u-AR l==R3{=Ku0;d)$$v{{>7K=Yd~LktP5D002ovPDHLkV1m#o7Bc_< diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@1x.png deleted file mode 100644 index 2859734ccff640e2a13bffe4bc3abf459ff11a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmV<810DQ{P)@7Px>vxi!&CJg3tXBLuFf-?T=QrQ& zd@~~6kBGTzofAP9tRe(HHxo}|Dvr@v%qHJ~yS^SD`oIC{EEW``GDs@OWZ4qY!($kj z`d?g;hf@T{Ew5y=kh4f+P%Xi2N6?L*``P5%acz1i2|Y?QcvMMPX<;}2*1oybDp%so zv}m+;a>@O988Znp9eQiC8;_z$$r`RzG}{wRVLFM?SEbG4vAY#6I}$RU zL^a%k;A$xh%zzPXz1w2>IUUHwHRI@`fC7~qS8yKt3$|5N&Q}T5t z6mFoxnuac>HVLgBJeovO&dvC$u&N5R70h0eVq8O=IYih6tn*^{Wp2;M&G0(VP=n5g zIh`$jmMf1%g&DaHi-&b9ia_2>x=E(XaY-x! zTou?Jz{EU)wODOqb?UCb1|MF;*gW~<)Eq+Ms$nzblDI9HbHG!HfSo}}D4H+R2sN`* zdo9Hav^kXEmsnx zGk@Q_Ie6#RjuRbCA%|qUJ=}Bbud7%*Ku6m4x7Dl}iA8tTZ#dd_S!b{6oXSmRj8?}p zsoRm>&FP(*NV#=i%>%y7#TwF*HBXHP#oCHD5mkhQ3pxS5;S3F75pD zMgN7zoue_%Zuqbu0awCnI6mo|A?Vsc_EKE-pq z$O#W;Bh#r@UfYW9iTj1y5(VcXt&0QMwI{H3+sd`4!q@MNhy4yuXw{}~+fUNcp`P;t zb7NQgeF{9@U2YTM*c zq=9NPkzE|r{*|Sl0vVI@dhTz7Y%B@SnSJi)vzRIW7g20Ky*!>SyVG1=10gCq9c$c> Q_y7O^07*qoM6N<$g3oB-(EtDd diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-29x29@2x.png deleted file mode 100644 index 3f987be793a6b767d23446df626f1eaca9888a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2101 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 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@1x.png deleted file mode 100644 index 49c41082ee06b5b8a3d4f17fc3897ac8e622ebee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1421 zcmV;81#^GV!YS^I9B5g{)hQnOc?j?j6aO>t?rLZ#&8T?S4-;+}cY`;aZLnoMSd3s` zK@cG#053pTfKZGy1c1_9a!?RzlbfN6jBz#0aOENC^Pjrf#^B4Gz(k;YXc zsD^vNY5p}8(wADL;K{-T_pQmjlVCi-s<{x1!a|I=w@NV^;IWNh;NbXG2t<@%j2kM! z7)e|qh{WLf->UR+N7`y(y@9mL*TJnhC76f`a#SF0g{SM6aR|p&*2f|DZGb`(a12C6 zVsvUgtKjlU>hN6{bFWNAdAJ6u^8vjOL(^nX?vLug=uO@TxE4qVoAf~6lq%}RBB(DR zjZ#A*BIPV*0XaAW8H2`j2t1Ng+?<8pF;!FyI6G~mfrs9#C1$aT_Z+pCLgpiciUItR z9R^*hs3@DtLC=vzt}rG{QXW?o;CKhjjDM=8>R4zjBaK2m=#u-&Qo+l_%Un#-4CLvd zA`hHC#jECWlGFO{q$jH_m4uDG3T3HX8R?Q>Hgo(#i_49~pK@<|(QD>0<+9cuE6F-J8ReWXZF zY}#504-}Jn!D>ouTdAHD2uZ&hA&E@DbA_PkTDh+7bhg^ucm&*1*|ku zp5y*mjU;R3>xjiv5vB7@0k2VT!K-tYQ^43qkJU8!vh}U{e48MOqw{w@yx#Ns>9v0`b{4O1_jGkMK9690I5KZPbnRG5r+f1Jr>$=`nQI2`O+0C9o$^ipHZx2C%OnZL zn6i>{opTO!ZGKTB#f9d=+K*aZ!^Q`Hb&q--ryTu$K6t>|GU9c#TeiPHbeuAnm?%6*E+Rx7!C4`>Ca?A#HnRGZj%y)NDt|tD^0cF$7ow{H zgXHeG1lIZ9Tl-leW8}^e0HWi{s0_dSu}F5R6J+s#rF}Kj4@pGfj*B zY5piCf5qh92~wm?Y0U&^;GSV9P!=l&ZQ?t9c?m_y7tM--=K7X87f8Wt&HrFfFWJjZ btCW8LZ;s}JR$)+700000NkvXXu0mjf9gwK$ diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@2x.png deleted file mode 100644 index c62f2d283a9ece9b562ed3f6d48604d2b558e842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2861 zcmV+|3)1w7P)7hz(sw9O zLRESwRO&xXQkp8o0i>2Tt&;`}0SXBi$A+-B*Ji=?dX2AL@7?ds?9R^a9J@0+W78y` zhSkj5**EX=?|$zMX7Uk(dASF$)cBY%2fLZL9rVO%Ce=>4J^~>UjgxSkOoufdoemHq z461w9lllrZ{oR-%H-f|)EOA)+L5%SFYL#q(wH|r^LqX!7BZHG9novJF9Uw-yzMOuR znTW?mjD#d{q)0qPVo4HZ4xA(lb-cz+kFFLf^Q+^O{M`XD!ZxO{+(K4JSa>Q$X-C*2 zK|gVsl6V3ubN?(kJwm2J+KjpcNINa7QSvK;f!Iv+;E+g>#RLf@$O61qLWDeQWd9b@ zJ3=nsE@`|aLz=M3pr9MvTxO=nN*g5)v4i#k{si$HO#pNWy#c>3FoD@i0ydVMN8FBxKlttMh%^tN;u4b&IlfXw}iRP4akRb()* zT=pzRxVnrImNsEEfWfyo$w(;8`JNhbYFN_;6blKJHc}C5{3!I<;2<~VsY_#XxaEKZ zVIBBVSd7GMATg;3wiJ*etOs2tfXA1UEs>M39^gWBaM{X?B_s^0cVg-DnMEBQP!t4& ztxW!8)PXTlv6&3vVSUP}js_a%%WX81J@&rnEds*wrLSthddD+T#c1ZD+CO4fD`m?9 znJma(xGB7AsZ<)u9Lm&*edAj9&Qy3DTNYK~k#9-7G?bYW?_5Ot>49=9d1ym^qeMxs zzl7nLM?={X;_uhA>zaYxOxfB5L>v~;+jS-kFXazstHpm@*EofSi`}!H=E59YmaJYoD~)yZob&*rVJqGcur47lDw(+4xJ%0oadmasa&R_9{m z)*_ws;1G_HWBnQjUN|a5T|OXNJDW0*^u(hCw6kGw3`WR!B&RVLBClRi+*Lt5usX*r zTMWc)&0H9$oRg9zibfKKNMW&g-U48aB9yJd@$#cCJTt_bXMk!5D>Y&G##ly} z*Qaz`Tk2@cxrDD07IsS^;WATtb`EH%B&W3LH6I>lPT+N##Mee-Yg@q&5W9$S30GN3 zFq#eq=%LkJl#rpHAP`BAE5$8GpyK1BPN2*z%qj>gg@v)DTba}fBP&Q4_i*}oZ$0^I zUx8TN%B;?DfUmNf#P3`Rl?Ey;G@WD>+wG*%lUXt3vn5Prvumwf3`3@YM3RG%v0f>t zBCI^|fOgf`=u|rkl;cu_VTyUahcM;q#%j7EA&RzIvVzBOl_MvG%!4wOW}z;ZE;DDV zGZ0277IFsL&)t)K3hZzql1@btU`1ztPy_J)KrS<>5U+L9;3OOo$pWP7!u@iD?{Chs#XVJ-bRWhKq0P^y^`fqvY^lozDt;nq<`)UlFf1`)NT9(%d?ETs zNQ|8>g^%TC6(LV(K3^@N7hn>|STBAu9Hhp)b9GK438g4%nO?47(r05Dyq7zp*sx^8 zc8;yXL`_$iFnDZKFW7Z97&Gh^J`c{BgRn@Dg6vA5ZaeX+Z8R*i?w4Z=oosZ7r+yF} zLaRTMy1;JvrfV^X6bY)J8(|QD2J$EIFz99{)m|yUhao>*6q~K6u`68tku+lIjY*{g z(GrPQkWp-#ku*8wb_Nl~dm*D3UdSIR>&BIV>B4Ff7UX(vF2!HD)<(w)#fDWEBO=zq z`Fa5>Sfy5(tDVBkN9WzN24+W(BDi>ZL6|h7VBpO|N-`!9X_Z#?2#tZD1;Iv>R4)`O zGoho`eG*SwK>4dxRjDjE3DZ({iB)=80P$uC=c6Q*-ru})v#X`WRnK0=6Y;A-Z}({L zNN6(e&W*07O|B-Xen#gfKbRfcRo_mZoJyS-JuBR+`an&a+fF0%`N;u)SaxYJ8{rj4`_$^PadGLqr2j22u`ssUr?3)?k+Hu?Ww>%})&!4?L-+JfQzr61mkHdw_ zy(gdRof_cZP-!VU^5Bmg7JEFI*n0Ho0>k10xdI6*#Fe0TCKjr)lx=V|Sxn~LjUAnJ zZC`%#=RFgbi|iqqN_3CB{q&~2IRAW0S03SgO`TwilQ+iB-;UfV&{sUeScyt2bJGWV z5B1N|#ldQ8#ZNx@l`pOTjKgd{yz{#|PJCl3n&UQ}JNM$@5B?_F$&sO+G~wp1A6)zc zU#p*5vx_}>$@{OuqmkXbuCdb!L}#Bp|C>5T!%M594+#<|DC=uHb36D zqPE8A?r^U=7rf54*VtSgHJfm<5DmX^>r&y4l-Y2AnI$MK4u9{$@6R{fXEYdh*WX(_ zVc?kW%-1*X!^uMp+c?4xH*7;!I5{!e8%@RKe$PTW2on*)(IR>*grU%ccjo50%BHRE zwRvB)R@8UZv~icdg^AIH3GVVQLvON#q18XT@(SDd#f(0`a-#@+COl~=u;GI5a1_E= zcnXA9Se@lY>s&HBFZZ=gkKy1hpTBYh2Y312%<$RUeLL#fT3rq8m93ZVc$=Lox7E-| zzsrH^ZwLBGG2kSupVN{-C@Ht&LWtiD90OsT>}lu#;l~EA4j}BAZ#!gUg-KZ^cl(KpS=H8Gmg24uuXfFMhHE)`EmBV+oxvXv~Sio zJnLUwQExTTiR=F9q4(#;)C@%dVcAe71*DdrZP@?ghetxhBpFDun& z+36qwVRivZtqsQ#@iP;B7-F~YbS$NQM+l^c8f7yXM0H&7@eJe5f;Q-#+M ze>-sOb>C^;Pw%`t?VV4EZ0`sEff>oS(NGVIbUt|e(Qx3U>;Eh;2qBaaWnrHy1q-tbXJQWa^-Ff03Ma*P1 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-40x40@3x.png deleted file mode 100644 index 9565dc1f9c72a8f8b2fbb9fbec7a10897d44e37a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4009 zcmV;a4_5GrP)^B zW8a5A|K~sd>l_==5)^?^?Fab2V2Nmjutc;%SRz^>FcaNa8s9H8BS)cxn~b`VI}qDH z=aO*ZB0?sjtBcST4z!{yr<$cRCmRjw*qTXgxv|7G%^T9d{UkEsDZX6oM^+g0OLi zIReBSHjwcXBUsEA7etAML64xofJ!YfmZ^wxr28UhE`;X7cqeP#iHw5=KX`sI=@T}q z!>ku$8KBc46Kr}^WJJ+<-UAWj40wUZeVoXX z|B>|Pg5?9E{mFN^K7*=YBwAc?NCc1$7lbd*#vMkvp%o;3I*9*M83(zxn$VsuIUhq= zC?(M%fG^RY!;%gg*f5?jnhhd%3ge))+nVxMt{I5daps*efNyjeY#igGek|jO0J%Or zny30YlV?bvmsNGJ02r?>K$n=%s1GY~9-yyZ{YvSFkprScR~F&_z_Q{zV}L5R8&SOt z^?R|6$fL0|A0tz2szVi`2|%>#Y^cu@_kdO`TB3D$QxRs)51I;Qey4`PCef;6LCqdT zkS9b(a*kN3jXWVbDB?Kg2iSD9x&UcTv^w%Lq?Zp8?c;(_JY0*FXyv_?M1VL?B!@|t zBzi&M=RzMmTwe8wF0rE4ns^58_%J#$knyDSM8mZR)Fs*#NQzvm?y3OGJJ%((v{a$~ z$&3*gmgt>&OuIu#aV583=R~qyHq8*tqI4()4^^Q&uwb5_AVMlBR;G*645!RW|lT_^rOO2 zC_a8@Pojb4F~2Z`)H|W3c5W<O+$$;n0uIs%ATb=B1h$r6ycGF&m=1lm?n18pgdrFV4&g0IFF<+Zk9+wJ3}_R8fHa zRk?{?c&5Sq8}i{=G6BF3RLjyJvYg7Y9-&$*PTQNL(V_u~2I~T3IW-OnENAip77!cj z>DF69|Tq4TO$ z?&6pc&6oooYOL|3nt>}0V75EdkZ5?g*&sGBf@vP}{nKjJM{ik9ZwFZ}FvJhRyn~Io zI$80-5G>_!Kf0LS$5XdHrn)Fr%_4vqltyxt184!^PSYV%p{zs)BRGQLPGc2;UjC>@ z(dQ8$-JBggr!)jgSw~VLGD@^u02{8~o396H&KJ8qujN6R=ebC1G;|r4gRc%r?x)ZAZ%*R04N)Dwt$`0Bh{M zUOXYaV=emoG1jVtb(IwD3>24`SRY2u#g*7fw-t{^LwBnwKz-h%Mi5dKuA!$>6Vi#; zzM3^=LUp*S3nWbA&~ti*Ef=mvJlbl+69^M4H$X@)OlMFa)VepYz1%6i zqGYOIthP!bM8_V$Qz?}Nz5tjXiBAX}S=^=;)Nmp$5)VcgT%^~NH1`6puHq8&IjLiy zj+k^TPoHoKAHeI)V5F)ZrMfl_(hUwS=0TclG#HF063!m0uL4(OBg6xY# zQK&f-M*-^?m;EDY`-)QQuNL1w8oHF$14=kN8)yM+OK8vbEgCtg3 z(RojjB=R-`n9KrW4*F@mEp0>%EOb{uXw`0Nz{;9f*3>c3qR(EOQC_GH0&|M52sVRj z4o8~!Ni;k_FH>`O{G~t_3EWPw;nq~(Z!UH22?3lUu@oi=`Jp-pU=*539u=X31Ivka zu8y+`iZeYed}p&EVGSR#_NeX&=q{GvkqDT-BMlG@0##!}eeQU#PmK-(gQW~s0mv8V zfdQ|uohr*Dc%;-UN(~T=NKKms7uHY#qg(|oZAyjRAapy^0ldoG7v*9O1Zjh4#JPFy zlwOax^k`LqguoUaU<+bP>xrO1pQYiPEf|PaW(f!A!nIc1>l5eKgKRpau*_cydVn*% z3yzhQa!P|hGZKwBced7sOH6@lU;#XA7QIXb^n+O=nn_c82E9i->&lKO>jFetA{ueZ zy3vlSOhM>!vAT5JK&m?k%|)av%o)uG^RB>XxuLcdw);lU z-227vF9v0p?{;!#;LJpCb44s&&{lo52+{DZ@GJvf>)9iXWyHCK5n9TE2K9CHddJ!? zw!LuQ!Dl;MXLG;W{-F+@=$49=HI@>mf0Fvnt<|mk{;c2g#&;h}zF8E>I?qrJ49|{T z`QgulQQXtoDw;P{wLG|Lo824>?N{2%U*GuHhL0ZcMd{HAcfk8{&mNKM2f{I7-0$r8 zb<5pk-(oQDT)yS`?%mW=ZmqqR-#;*XY$}uz#m)#2XE|riMrAOh=R$tMGT@W(ld!$m zwfi?M_uRkgR?=8sT=nXPNAExK9QAZhaPHZY|75w*v8g`L9&5{1ki%W8e)QMw55g&Y zth80GOVAs8E*z2cabl3NV5(}WVo2|2v6>M8-zg@%HijW_a#Z}se(4g0dWla!ySN>B7T7t3;P zIbu98^V#q>w>NAihwIBP7k@tsKu7I!cHFyiD>=Nmy7lQ(ZzsOtdPg(=)rKPB7rNfh z@=j8es`{~xuE~C$=%(Ua7vm!M)Y-`sy{hyw(8y=K@w%MtwHx^T!^6i%0@GREM!<~d ztRMA>?(>fF`z2QT3VsfInd@$f@vwW~@Pmi`l-mBEkz<~KmsmBRiyv5d^OMK_#=m+~ z^$+>|EQdh?fsPiPWTueSA%fXpJh`XW>8njeL&02s(#9JJzV*NT5C7l}a=5echG$N_ zP5jRv*K8=8SKlxU?sFc^{x(vGQD343aE0WVOZ!sy2fNnZZq(!4V2O3vHD#+0jNzF8 zzg&9<|DOH*?IZqd^@c>KFVRJ&xM~Z815}>{L~s94XKH)L#kA{tfaX0qdU|73taJwa zKp=WeQEhX@D$){)g#MECFi4PJ61{?p@DWV`UcfCu925i0TI==m&^P6*Xa<6&QJ0bESi|SY?rkm`QzrFf?{tztREMpGo zabWzkb9S_*$RTL|Qi68k!8$56#E8` z{%p-{i7jWR1`bauy&Rbe=3QGw^PS7L+|_hbV&mt|uixnVRNfmAz@R4}dattDnLr_l zZY-&z`p^U&V_lCNeOcu6bS^j#k~5^fbabL;cy_F+=u*CA?}aZjJue%iRO6^$w)@W6 zPaf_NV>w3zqTyG%Klt4>yU5|0i@nFE&&zXZd5GqJl4@aihB0ctv*Z2#L#a`D+3}CQ z&mV8Or;v*=J$s5NQzJV>gYqGrw|f;DsZNICi=deK0o505nn(7Yq1zvuTN#KTv*G(F(^2j(O3Lh_ zSm0m_asPu6%4EIt5G8ul9V2?khb#d+H9@C~P2(Z!Hj#BnVw-M$?P~si^40k7X@P!k zB+)t&F_fb7uaY_=G6F@TF)AZmC2lwx+sCv^B zW8a5A|K~sd>l_==5)^?^?Fab2V2Nmjutc;%SRz^>FcaNa8s9H8BS)cxn~b`VI}qDH z=aO*ZB0?sjtBcST4z!{yr<$cRCmRjw*qTXgxv|7G%^T9d{UkEsDZX6oM^+g0OLi zIReBSHjwcXBUsEA7etAML64xofJ!YfmZ^wxr28UhE`;X7cqeP#iHw5=KX`sI=@T}q z!>ku$8KBc46Kr}^WJJ+<-UAWj40wUZeVoXX z|B>|Pg5?9E{mFN^K7*=YBwAc?NCc1$7lbd*#vMkvp%o;3I*9*M83(zxn$VsuIUhq= zC?(M%fG^RY!;%gg*f5?jnhhd%3ge))+nVxMt{I5daps*efNyjeY#igGek|jO0J%Or zny30YlV?bvmsNGJ02r?>K$n=%s1GY~9-yyZ{YvSFkprScR~F&_z_Q{zV}L5R8&SOt z^?R|6$fL0|A0tz2szVi`2|%>#Y^cu@_kdO`TB3D$QxRs)51I;Qey4`PCef;6LCqdT zkS9b(a*kN3jXWVbDB?Kg2iSD9x&UcTv^w%Lq?Zp8?c;(_JY0*FXyv_?M1VL?B!@|t zBzi&M=RzMmTwe8wF0rE4ns^58_%J#$knyDSM8mZR)Fs*#NQzvm?y3OGJJ%((v{a$~ z$&3*gmgt>&OuIu#aV583=R~qyHq8*tqI4()4^^Q&uwb5_AVMlBR;G*645!RW|lT_^rOO2 zC_a8@Pojb4F~2Z`)H|W3c5W<O+$$;n0uIs%ATb=B1h$r6ycGF&m=1lm?n18pgdrFV4&g0IFF<+Zk9+wJ3}_R8fHa zRk?{?c&5Sq8}i{=G6BF3RLjyJvYg7Y9-&$*PTQNL(V_u~2I~T3IW-OnENAip77!cj z>DF69|Tq4TO$ z?&6pc&6oooYOL|3nt>}0V75EdkZ5?g*&sGBf@vP}{nKjJM{ik9ZwFZ}FvJhRyn~Io zI$80-5G>_!Kf0LS$5XdHrn)Fr%_4vqltyxt184!^PSYV%p{zs)BRGQLPGc2;UjC>@ z(dQ8$-JBggr!)jgSw~VLGD@^u02{8~o396H&KJ8qujN6R=ebC1G;|r4gRc%r?x)ZAZ%*R04N)Dwt$`0Bh{M zUOXYaV=emoG1jVtb(IwD3>24`SRY2u#g*7fw-t{^LwBnwKz-h%Mi5dKuA!$>6Vi#; zzM3^=LUp*S3nWbA&~ti*Ef=mvJlbl+69^M4H$X@)OlMFa)VepYz1%6i zqGYOIthP!bM8_V$Qz?}Nz5tjXiBAX}S=^=;)Nmp$5)VcgT%^~NH1`6puHq8&IjLiy zj+k^TPoHoKAHeI)V5F)ZrMfl_(hUwS=0TclG#HF063!m0uL4(OBg6xY# zQK&f-M*-^?m;EDY`-)QQuNL1w8oHF$14=kN8)yM+OK8vbEgCtg3 z(RojjB=R-`n9KrW4*F@mEp0>%EOb{uXw`0Nz{;9f*3>c3qR(EOQC_GH0&|M52sVRj z4o8~!Ni;k_FH>`O{G~t_3EWPw;nq~(Z!UH22?3lUu@oi=`Jp-pU=*539u=X31Ivka zu8y+`iZeYed}p&EVGSR#_NeX&=q{GvkqDT-BMlG@0##!}eeQU#PmK-(gQW~s0mv8V zfdQ|uohr*Dc%;-UN(~T=NKKms7uHY#qg(|oZAyjRAapy^0ldoG7v*9O1Zjh4#JPFy zlwOax^k`LqguoUaU<+bP>xrO1pQYiPEf|PaW(f!A!nIc1>l5eKgKRpau*_cydVn*% z3yzhQa!P|hGZKwBced7sOH6@lU;#XA7QIXb^n+O=nn_c82E9i->&lKO>jFetA{ueZ zy3vlSOhM>!vAT5JK&m?k%|)av%o)uG^RB>XxuLcdw);lU z-227vF9v0p?{;!#;LJpCb44s&&{lo52+{DZ@GJvf>)9iXWyHCK5n9TE2K9CHddJ!? zw!LuQ!Dl;MXLG;W{-F+@=$49=HI@>mf0Fvnt<|mk{;c2g#&;h}zF8E>I?qrJ49|{T z`QgulQQXtoDw;P{wLG|Lo824>?N{2%U*GuHhL0ZcMd{HAcfk8{&mNKM2f{I7-0$r8 zb<5pk-(oQDT)yS`?%mW=ZmqqR-#;*XY$}uz#m)#2XE|riMrAOh=R$tMGT@W(ld!$m zwfi?M_uRkgR?=8sT=nXPNAExK9QAZhaPHZY|75w*v8g`L9&5{1ki%W8e)QMw55g&Y zth80GOVAs8E*z2cabl3NV5(}WVo2|2v6>M8-zg@%HijW_a#Z}se(4g0dWla!ySN>B7T7t3;P zIbu98^V#q>w>NAihwIBP7k@tsKu7I!cHFyiD>=Nmy7lQ(ZzsOtdPg(=)rKPB7rNfh z@=j8es`{~xuE~C$=%(Ua7vm!M)Y-`sy{hyw(8y=K@w%MtwHx^T!^6i%0@GREM!<~d ztRMA>?(>fF`z2QT3VsfInd@$f@vwW~@Pmi`l-mBEkz<~KmsmBRiyv5d^OMK_#=m+~ z^$+>|EQdh?fsPiPWTueSA%fXpJh`XW>8njeL&02s(#9JJzV*NT5C7l}a=5echG$N_ zP5jRv*K8=8SKlxU?sFc^{x(vGQD343aE0WVOZ!sy2fNnZZq(!4V2O3vHD#+0jNzF8 zzg&9<|DOH*?IZqd^@c>KFVRJ&xM~Z815}>{L~s94XKH)L#kA{tfaX0qdU|73taJwa zKp=WeQEhX@D$){)g#MECFi4PJ61{?p@DWV`UcfCu925i0TI==m&^P6*Xa<6&QJ0bESi|SY?rkm`QzrFf?{tztREMpGo zabWzkb9S_*$RTL|Qi68k!8$56#E8` z{%p-{i7jWR1`bauy&Rbe=3QGw^PS7L+|_hbV&mt|uixnVRNfmAz@R4}dattDnLr_l zZY-&z`p^U&V_lCNeOcu6bS^j#k~5^fbabL;cy_F+=u*CA?}aZjJue%iRO6^$w)@W6 zPaf_NV>w3zqTyG%Klt4>yU5|0i@nFE&&zXZd5GqJl4@aihB0ctv*Z2#L#a`D+3}CQ z&mV8Or;v*=J$s5NQzJV>gYqGrw|f;DsZNICi=deK0o505nn(7Yq1zvuTN#KTv*G(F(^2j(O3Lh_ zSm0m_asPu6%4EIt5G8ul9V2?khb#d+H9@C~P2(Z!Hj#BnVw-M$?P~si^40k7X@P!k zB+)t&F_fb7uaY_=G6F@TF)AZmC2lwx+sCvJzu=(#i?!A9HYg}$amw;Cx)9Wp ztkZdIuH;n!hoX4HRK!{t;GpoVJHs+p)d1v4g56B-?*x&$3`u zD@sIhQleSP%d$2B9kR0Y^r!W`qEvERqii#brpKhRc*p&hak!R_ZMD4XrOJJ2dG+Nq z@UE-+W%cE)?e8xx9(VI6cLCKeT#*=PXj)w~3^=^905qom3p|8fwaiIFdSZhFo0F?` z$^KwGhtSu4XbPEOPqLVggr-LE43Aa^=H`uzkYd=Xze5i(dH*JqTa|jUWdUWe9w)Ck zf(#r)e_=oc+D`u83J4Y>Qf-E6vukwhxEO<8H97)W-ffsE-3t)LJ|duIE9+be)jGX# zHC74$&YWpV#Tzgw0gtl$v^;O@%kSL_)W@8Oyn6SVIJvY;_qCn@lDN05c09>LaY}BE zaC33ae0Dnhoam76^P@(nNvbxJe&qCRJfv|$r$^_|bKyqwH;T~}=%&)5@i?FlnrfuR zDbd#I+lrh~fn&|A6z9TB*o`n#@Wy{mS^!Mh1h&ZVNIXK%4+(^5l|fo*qlm5g?FfL( z1hi-BSn6Qxbuy}FKN0?>9b9Ik|EI-DX5`T2aJ{u|Q5`Z6Qgeg>z&9k?wAnYW0i;9V z-j)`RB@vtFA|0f)L0a*ZDg#x9At`zADzS}hMn#@*0rNuQbIpALHt}3?noR8E1Y2C3r!k{Ad>`b$m?wqLoSB+3rwLD_@L0gCRWrA4j$w1IP|VG($Wll z>Xr4V8`W`y>SBl10wJ+ye_o|41}Z<>S7KeRP>u};Rti_i4A$bIW^$(MyjUJ^2ws#a zDryK?goXm9{%|3tJ2;y%9;5O1kjt?VtlPngN>f<}@EVgTAuYO7o&mWKC`-Derx}&s z@%gXVwtGC>DYs`%>oF+TL#*)3raJ%!Oe)7m5PE{oJkh6>D;T+yXlJKhe2zO@S>i`( zCAzzzLqj>KXp2dmHZyF~ErGk0*PSfZ+ulM3oOB(67$?|4)SrHwbN4UQ0RjxV7obRV zV%}n(8xU!mbEsGEbR0S(f!v55U1;0we5)`hnb{g)0QLCl|fQzpodi)0(O;AfgA;nP2Dk$u2kj} zMT%XIFybf7{w8&;ECN$x>+Y7Mo? z&?7r|f?$ouMR(;nW(c*_wlbGV2EK|2y!D8~V-&SzxJ6uY(TJjIJgjzlhXBX}(dhsCrTxdEL)-}yX&N{!^bY!8onXX^=XxKJ^=CndNX9Qg6QlEA^Li}Rl#H*U}Jk+5ssJ@>=;z7aM`5uwnqxJU*+#ROYm4$8ETkbr#o=pc3jZA zNrTX2!klB%iPfF3I6qN^Vx-2jA}?bJcsly(jFtCXy_UAWd2jc-_{i2h5Us!(SwzS{ znM3R?4S)^J@ZD%mDi9K1*4|U<%lG`l)cXRLWVjgvm-3FQzHB~TCy7DbHAYEvZczw~ zCpI}xjDd?vWmBeCC|+z{uH9X9U6&{s^r`hjZ&xb3I2S#3H+_cwzpBvn75T8Dy8@9g zVxp(w5%%376?D&u-x;<*L6f_F=2kJGM%~Nl{s>thA%fr3MjvzD|Khtdg?h`jf*_63 zQcg%(cX4f8QgqRz&7m{PTF0xOZtNbB2`Rip_NyX|)b=$z*etAjmF&UmpcG=AI@C0! zELJbQ%{~gT1w`sZs#nU8YgR31p0Zg6$!?o|2x#rACMzp2A5VT$hm+YZG;L8@TY6+g zfW{FVhlRz(0klblQH6=Q+h97S*Ah|^;?O;6%%jjRA;C5ID}R1f$9`;EAH#aTfGB|x7YqEH zHX2+LS_)ce$TlII1NKt8V;BR5`3ZWIV0Aw{l>}fS-Ffw_JZ-ObJDbe03(mp13ba%< z^ma;Im!v4+mRssH`kMB+B;gM;f)PS}7w>ZmPof7Kb_`0x>1(smBgNk~ojact_SGqpbS$VL{ zq|=tn+rEL1Jk)muL2?#UxYQq_{arG@Gn4k_%-VroJ}TbQ6qkM)6|0r|b->aH!HGq) zhI$JX`qt9)aV^nrGNVqa$b&D0 zwd^HoPrYJ+NPfDh;G?`(*kg4o0;4Df2o(Lk^O7E_4i|JJCd~lc9L&?KT+UhZk(CG2 ziVw+eT3?!EnM;As_@`8@JwgtqYO7>lsi5Psp(Z=629np5E&F6P8|4vKIUzN3-LTY> z@sl`>V$}HIwV&skfg|SzYkOM#U^G(0t;X$3H8gScqMP~b;QyRTYn>(J>w8{>Ycot( zL&Zq3<>^k8+b{Mi23jTuBe2p~{Iavin&H(belOBo8z%0-gb>=1yvTvK02yMnSM|M9 z|Do~NvU|9)6R;ehcaGQjOelyf6*Y}8fI|(crv13%{+sQe!suzy>?{SBXvw4!kE0py z_ZExAZJQt%+tEwNt@bQU{L5l~4unknjr*bWn~2zcMpS`x$3UqMz(-P}rn#XHctb9v zQuOKd3R`gfpA7=x{tJhMQ%(6p1QknP?*QF+{UdI2L`O{?aIF3-pa~(ZLSJ&qprdW% z5cfg$`16;!p4A`<4U*_^nH{+Mg{Gs32|HgH(0{>H9A*pd&RI>DFQr<-{ROp%1sy~j zpx`v4JWc>*x1l(pMl%84uGUFo@J4qFn#RF8vB~KT(CV6>Ug${fLQ?d`b%@{*JXl5W zLtSNkN6-L)jRKx8SBeBsdK^!HV-F#%Z4EjcH;|x65Zs>ovwwst@DWxgFIDBky!D9& za`%A(G5NEp=H>7)O77HE+;(BpQq$*KUqdeqttX)kRWZC-_{w z^?sT&#bfHJndSLJU-!8B?Z}t}67Qj%YcOPD#|mhE_nhZvML>o0%P3g$TO|-DHg}Yf?`pHxe9S z?Kq2DZ`6gM^lmJh$>!@r(wsyljWf)7$DdgS0(qjUdu?HeJ% z+u;ZyNWv}d@maI%cepr1y!zhtV9JKNx77PXKk%3Z5hKCgcTggNk8fi{k+CI432vHU za_R#_9WhV!8}z+^qg;f$uo>7COZ)D?x0|`?mtfnaw6`@77hHH%m)jpLil$6R7nW1h;XP(1 zZi@c>xH~$FCbz>R5BtmLjwOz5ZYNGB=P!0Mt$)aCX-QA6OY&y2>vTA_F7Z_m{-iML`Nr_~SHo)r;FoUxxlK!&-? zg{hav-O@c=sQ~{cQ`$M6oR2TQtrT9f^#PR+SAn;GnmX*4p_|N{V3a%O1vO^az0y~= ztA?_~YFOu<;ghhd7?I^X$I($T*KfRO&bmu=koE<%H zwOVV1_fOnr&`bR#*)lt}*W2T8fpwm_ZoN4ws{QT&Mrkwi-cI^2+t9R4+xx4|%uI(6Q@t1P5 z1jODvZ46fua%#wi{lz|c_i}SlEos-i_Li@_FFu;pvwr;%-UDx)uLg;%)cqyYW79CZ z-~XE@n(30M=-lrvjQS$RU!XI+XtEyq{uZ$s_})jCCi&E^D}n{K?(~E|*Wc~69yp=B znnk{Q#=q{2sXSn1_ocqBQO*0Z2+M;3L3d_~?8jCUzT9%koKK}Q< zZ|jeKf2}j+%-7SggM#(>clpFD+jzKSWvQ8Pz}*X_*_GWo;f94@jPu3e^J!cCKP7Bo zeOJ(gc54`pEa{oU8;pj}l< zx*19I@^sRRu$n*QDKmR~4(DrK;0}y5M~xD9r%KDYKJMt2r+pXr)z@IEqpPsR&T-11 zYHiV|kgn&tm8OAjZ=>3;3P}9t<7{qVK<}u?F@1mv5axkz(9mx%l#i2;x4$P^IvAMQ zc|Aq5RUGe&OdJth=CZX{tI*6!OBdyfRUb2bz9S_3H-tmV6VZpzcrTqaZ<}_iSBmc& z4x75>UsS}_=BCO=iZ>8^?av`xJ27ZuZRg3dW50@O6+FT~fKrYb)sXC{1N$0`vUphA za-a(Npi_F@JJ*X}T(((0UMcLDO|`8?rgN#8w#!5d@NBJFCYgKenmu;#mlB^6gV&lc zAjjLWUKLNYg@#;KWM0)z{&P0iim~3yycy?C;*GPF4>KOidTe|X>VWpiJr!T|aagD1 zHLQ%pO!$c-OHFF8S|jh1W}FpxRx!cX+22rD3I#IWv4)H5j!nmfI`8&%H`DgS0=k8J zFz?b{+)^gv`~1YEPq7;^KAC4C?$AIMETFvx6L2(s*$?>uA;J5cNDPXUn;1erI$` z*ri51cx7u!Nw7~1Z3N_Wei==_*9)b0aaozwUd*lhG8EMRd>LQ7Z`S_)ql3p64~ygu z0hc%5vO^v3&%FtKmr@N%U%Ri5RFyZL{%pH^94quSdkF6wMZe}FP!7=plYU;LxjLN< z@(jUtwc9uS{rSrBkw}pNF=f-8vGP2hyU$IB{q!8z80^+v|NqNB1LE)SN{% z+o8|#-Z^`?y3-SDb)Hn{_(+wKa*eOerm~umP#1uJt2w{Y}iY959lMY%-eJD_N&5KhW#gz9q*7Ig)yCgWC7cBkE~xv!puLV7vRfiotsPNBoiC zKMXo^QR87u2%$7oZlThRU*n7diGHK~ZRnZ5CkS7fq8VyB8b6Z9S-i~T`i4!Pu}OPR zQ!qv5FXdW@)&|h~z-)8Cw$R3IXIp^zUG4N`!a*Ur$bP?;4G0~9{%Z20naQ3?j5Vu16#SDOH~kOODTk3R(r z-!(S}ClNgeOw1|v>;%GIcMy})&T%s;vj?5l(wAxBQLV@6PQNG#>8M*2o|C;)zW1(? z%&en;GFRs{P{8m$Sr)NtG#R)gIfleFJSpZlUKlK`%6Z+x;ku>Efr**i2ga1bJv^GC zud>BIE%-d;^nj%Vb#`Jyr?e!95*g{IAZkXxBPqo^W$a^QVETV>`Qn(*jf~h8G5lxI Oq9`k<%U8*ofBPT(#@0~) diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@1x.png deleted file mode 100644 index 9a04de115e58271b9f967302a04d314a1185e7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 zcmV-&3XS!NP)Q-vbGa@?PS+puh)CyJLl}q%gY^UeRC|2AixeL!xt3|T4 zn*Q(b6ED+Jkj&&rDoYmGmduic3`rYO4+iMAyN&YvG`#9m_2(q!q1~2mJ8Z;lCxODL zT#nL~2rry%r#{KD zflDFe8f-3-&XSoFnNCuwuuM;EBRvBvueU0a^-Ki~bk*AJ?WEB|YMf*=K}{Frxw)2H zjR?BC=~0v(;C|n}3`weid$#$=P@J}5hgP2?hggz;*G_GfvE!*2bV!QkNReF~hGgYP z!ohI2f+%;zu~O;^U&0Yt3ogXXj)>(5MV%=`b_n0a!tEg4TWGL>452SXV`ddpB!kR_ zSc(Le#8fhGa*(Eojbp(OF-DLDobbcQ4NQ^b5Xce1tt7_5TjK7^fP^U+kau;`!wOdh z5XX-v@{t`(PDrS(BJV|_Qvw7ts>rdDlEhTJF)s(}2+#!rWH1%g&?;i+kz6**3}ZN7 z2vd<&3JlG;vGEiJ?|0CcF{SH=^<2pE1_7@KhRK2qVQ-L6ih|PE5H{3SADKXGtQ+@N zKwan3WGq1?$q|VQR#c=iN@LUHr3pPU0m4Yu2WXwC7CR%5aad+dDmqlK~;=u=-Ab%7JEaMtZS{C+)3rzNO{cYDxQLLCz&x720@G- z#W-Pa)afpc*mS>Ws8g+gRyRX<9i+;cPm7TUAa2&mcVx6yk;k{?$Bl5$I2eLzbhgO5 z0ro64Y|Oyw)R07|tBt+gxw-s{+#WO{iL>2Xqe;s@w0Qi}HmHSVc=BQ;J^?b7HYfyV<$4d*P5B&L3ohulceHo{8? zK^Z8QBu5CxYFuU>A>qGpKp>cuk#ptLJIx!LP=uwH+aY>n_YE& z+04S&NT~y~y4EfC4;K0Zdp419G#?D^YL$aHOtv}`?pMEzD!RrKz|3)y7;`7wqJW+> zwQ#D@Q>1lp36e0OoVWyT7PD9BHXwO3U)l8gh$hM1NqmlGuzaRTGK3~enUUPzM*9yH zCK9+o_)2>NmDY5Onvd2&1*&yOe=zRx1=^Mz0DR0wpSDJUJal-v;Bub2Pd;Vm_GY;S zr^=KhVONl0#tNSX5N&Sq8(9v_HsmIu5PD0WkhYHt}UGcs0-%c}+Obd_sM`Il_!u}X6{ zJ(5d{ve~nKozvSC2=d)Tdf|F(ESgS~ImG2de?da|>iVk(pFg;1ukuJHn>l@J@V5i+ zoQ}vT$lk^;^nU%9dN=vSg*OIgLWjTlbF`0yjz53)_az{eOCKFlJbD z;F5HkFD{n_huyKSW#``J`+t4m&DXBHZ}O^-Z(f|7pK0{hJ+bj2|3BRGSve66x~sZd zyU;j4b#)1bq##MH%7y@v-GBb^#pv(`Z{2~mhknxe-Jo~ zCy$JrSYi;loWT+r70F1v=!=R)T%8TS9s2mtwkKNy4POrKI5G8aGgm`$aHt)y(>(TIu$mOM!?CkIsOtp2a?d(uQYW& zP=60U_{Y(crk-jzUh$ILS(nf2;YF0k4Xi6i&q)8vyAHV>uBY1{c`&#GM=nIJ4Ma!E zA4&m&NqX$gZ*Qh{Kb1+HnKCh#6qs3@`zZX+1MLqVr0$Up%#_JdL$yXxu)4nT#b-CJ zqou^7Bd2bsG)kbxI6QP5BsoL4$9G5i%Nc~Kc&|fJ^Y;%r=&HY`)?2g5AN>B7ukC5R zA4jGVcV52uMoG647s7#vCp<4NWd7U4zorw>dLNzDcul6?ep?0HeSI}{uL zLH}>Y3XViVi3{OCfd0G7N2J}wT;|Ad{|oohZf~0jjj{Wh`=U4-iC{y@3T!!UVX}&3zNScx)vJmw1ILX9<<$;#LR=CEf zRu2+wb^Y)f`--ZcRnoN^TI(mu7%^U`kae*1_r`3~`uUI+NxTgDKE$n1U2Uwfx@%?d gf0F+zxGPBh7ixl!?Qg?#od5s;07*qoM6N<$g3wzkOaK4? diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-dev-76x76@2x.png deleted file mode 100644 index 8992d80b5e677e06fb7c26c51057921f2fab06ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4599 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


pRt=ekgBSgCysr`#^$)g2g=zhqLTaAPesU0c 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 aOk_*&w{h~Nbs#(um diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-20x20@1x.png deleted file mode 100644 index 40a864fdeae4d5f0ffb94b6c9e0c92ce7f22c301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)%jICh*qtBSdVaaovQ;EI1@hkqq^3 zRQ%kQ*HDb(sg3uZ1$(^eCMVCIQT_0e`#F>n(5N+%8@4b>K6Y_YL#6H|V=8tsSXR*; z+SRpSN&K~-kGg@I7w5GQL%oB6!S}maEGkeX-b*`urv~HoNU10#an;1NKOpG&2~VXa^n`fsPo7suddb*mNklh7Of<$jFp4re?3Qgi&=yaYX1bl3-<+8<-Dy!!V&6C>Y2a$d$NY0PzlfZj4~@FW&sdYPxk`pM;Q^ZJwpSR0+xzswaEO}IsBm`uBqShb?zmdn)L1cA&Tx|uIV#rW?#AKrR{_Rx()2@z{J(jSAZM^s? zM4gP`Tt64$T3M082U)-gu0bZzSj}PE3W~2Acs3_QCBeBh$_3i=5kI>nyM9+ZTe)mU zXDSK!t0lZ&5u%b!B@j?}k_Urjm)zS`0KDITGUGd8sw(5s02g`#Q0;YST3oh}qPt*OA)YN@s)R+WJQxCxRT$G<#0))BtBmvc9lW z8CWhZT6vvXIj7g#S%@GDujKl)$ z)ASI|_VIaPI8?^(m1?C$v&DA>53q;F1%a&IJlJ72m^7u$ z4s-wBYkUG=?-NM7*VwdjP|9UJy9aMGcXR?SCMJeu~WX|J7ODP^VBdd3U3Pyrs+J_* zc1<$+)a+4rFmG~k2$BZT?{?_Ma-yFaJvuaK@04D@r-3yOa&ZWfu2-0`u9BYP)8U9r z92O6vs1*6QU*qwsQ`$YEBV+!A89~zJB7d&yRQ6pTjhJ-LqVABo;@RWIL?$#ZB*#-mUjwKeu#A1Cm}Q*w0VF;>e<`0cM&<}lTRq0 z^R7ga%^8ty59oD=>~M})m|Dz;Q%~+Y?y{h=g~)QXS*Qmr@1WzPP)Iyd#}qJr`l*)~ zZakGi@g48_HRG5KaHNgF1c z-5A*uXk=HFqBFiO6vJVsN~fnH-7uX2f(Qh>*GO{{kAg}MH=Hr*j~hkrtE7@n;yntk z0JyNt#+Zbd$0^}WJ&^n)A|10FVO+~Qk#B32bZwGXUe)>YtQ$K4PkeOC8JBZZ3Gzuq z8nGvdA?o7phTw`M;dxB_g9}3mLlc$$%a5GkrwB2J);X#7NCNu-%_awwofy(c9&E-W zszxL|QANT!JaFg0{))NqgjsqI5^4=sikuEsj|U?|@&i{M)_DMrI}oAxn|t)bE;ajs zX>fD4m|=glB1HktGKI|$Tp$}%;C+ji`0o?1$%Guu&MNaNmyC!$Z#qow+k5ompWZY? z6PSdJx-Kt1pe+#gyKo~V18F>Fy~u=M`{4cSK3~L&BYz;VvRfs#vx?#v075iGYe!9g zG+EJTIliEjX-KxNDcF=XZhAl&c13;h^fMMJ9(23p=%^xGuWhyC)&gGAjwY&YfANoy ztw1)?Ahe;=OJR{nDF;J`3gYmR@6PZxt9d#TAqg%8!nQS@L<=rI(a+AFGzp7@lKj*2 zaNXrqeKsrutfet<6>dXaY{7fNFyGfiGiGg#D$e?q)$6 z4@Sa{)rZu}@i&CQ85*6t;S;Z?M;x;hv&^UcfaXaB><8YhULv#2#Rx3;`iJJ*7$qsU z=Gq>DlH6V5Sd&ZKe8c2OMs(pDMRvD4IjkhrxNJEt4d5c%%~|X%IY`i!VQtyJE3(+6 zt&!Bmf}~MCjTY%Oq`PWi(kL<3WGUihVaz$`KrYthO^b1V9uCCUgN%@#e;*f6dg0%5K9O{{Cn4n~4C~9aH@#HOAJRet`hmz>0L>G^& zgo`r!@-Dx+*FIO`~~=x6`H2 zJ9S(wpscXwkr%jOQ5Sz1!f^275O2Cm%_#Qk6{rF(NH87nT#~;OK0&ExKlPVFNxKck zswgaz!i+NQGhuN9HC7LEIaMX>l(5%o8=O+0?>+1#$NT9srU7UqUUacxm4Hc`v5>2tq{Mh;blMSZJ=mu+m9*tDVyOx>g} zx|zf!$pQ)~?AGyPfMy<-Ro17)6mC}W^EX?km@Daqe+ ziMYywzqYd;t{ku X{2RGMo3C-@00000NkvXXu0mjfne$Eo diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-29x29@2x.png deleted file mode 100644 index 7106c08f484fad38df0cbf809848359bdd8c9834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 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 AcmMzZ diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@1x.png deleted file mode 100644 index 98d270d271118ddaa5aba882a6b6d1d8ff0ea801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 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 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-40x40@3x.png deleted file mode 100644 index 779282c12191fad4e7d046e5ddb73f885b17781e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 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 JPDHLkV1iRG4_N>J diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/AppIcon-prod-76x76@1x.png deleted file mode 100644 index 41a3dd2257afee329a47a0ecd4441c617c915c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 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 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json deleted file mode 100644 index bbde14f4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Assets.xcassets/AppIcon-prod.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-60x60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-60x60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "AppIcon-prod-20x20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-20x20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "AppIcon-prod-29x29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-29x29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "AppIcon-prod-40x40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-40x40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "AppIcon-prod-76x76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-76x76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "AppIcon-prod-83.5x83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "AppIcon-prod-1024x1024@1x.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Info.plist index fd74b1c1..80173535 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Info.plist +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Info.plist @@ -2,8 +2,12 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + WonderWords CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -18,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Runner.entitlements b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/.ignore b/11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/GoogleService-Info.plist deleted file mode 100644 index 94f3bdbd..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/config/dev/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 67633443658-glol0em217f3bkcehn78440pa8uk7tir.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.67633443658-glol0em217f3bkcehn78440pa8uk7tir - API_KEY - AIzaSyCtQjSC3EiD5tDtJ4-fHh1bPAUASZfVAgo - GCM_SENDER_ID - 67633443658 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWordsDev - PROJECT_ID - wonder-words-dev - STORAGE_BUCKET - wonder-words-dev.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:67633443658:ios:ee73f9ddc856f860a8c7b3 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/.ignore b/11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/.ignore deleted file mode 100644 index e69de29b..00000000 diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/GoogleService-Info.plist b/11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/GoogleService-Info.plist deleted file mode 100644 index e9062159..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/config/prod/GoogleService-Info.plist +++ /dev/null @@ -1,34 +0,0 @@ - - - - - CLIENT_ID - 581028325132-6r6rdr8jhgfirrkretftm19das1a4cks.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.581028325132-6r6rdr8jhgfirrkretftm19das1a4cks - API_KEY - AIzaSyCz_4fRFcYhGt-9j0VmDLitKNLTVYWCf7U - GCM_SENDER_ID - 581028325132 - PLIST_VERSION - 1 - BUNDLE_ID - com.raywenderlich.wonderWords - PROJECT_ID - wonder-words-prod - STORAGE_BUCKET - wonder-words-prod.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:581028325132:ios:f2a34dfc51420c7111cb29 - - \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/dynamic_link.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/dynamic_link.dart deleted file mode 100644 index 6faba8b6..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/dynamic_link.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:package_info/package_info.dart'; - -class DynamicLink { - static const _domainUriPrefix = 'https://wonderwordsdev.page.link'; - - final String path; - final SocialMetaTagParameters? socialMetaTagParameters; - - DynamicLink({ - required this.path, - this.socialMetaTagParameters, - }); - - Future get url async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: _domainUriPrefix, - link: Uri.parse( - '$_domainUriPrefix$path', - ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, - ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', - ), - socialMetaTagParameters: socialMetaTagParameters, - ); - - final shortLink = await parameters.buildShortLink(); - return shortLink.shortUrl.toString(); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/generated_plugin_registrant.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/generated_plugin_registrant.dart deleted file mode 100644 index ed74637e..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,22 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars - -import 'package:firebase_analytics_web/firebase_analytics_web.dart'; -import 'package:firebase_core_web/firebase_core_web.dart'; -import 'package:share_plus_web/share_plus_web.dart'; -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - FirebaseAnalyticsWeb.registerWith(registrar); - FirebaseCoreWeb.registerWith(registrar); - SharePlusPlugin.registerWith(registrar); - UrlLauncherPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/main.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/main.dart index 7af4fa3b..1daed5a7 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/main.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/main.dart @@ -1,17 +1,15 @@ import 'dart:async'; +import 'dart:isolate'; import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -20,22 +18,55 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { - WidgetsFlutterBinding.ensureInitialized(); - runApp( - const WonderWords(), + // Has to be late so it doesn't instantiate before the + // `initializeMonitoringPackage()` call. + late final errorReportingService = ErrorReportingService(); + + runZonedGuarded>( + () async { + WidgetsFlutterBinding.ensureInitialized(); + await initializeMonitoringPackage(); + + final remoteValueService = RemoteValueService(); + await remoteValueService.load(); + + FlutterError.onError = errorReportingService.recordFlutterError; + + Isolate.current.addErrorListener( + RawReceivePort((pair) async { + final List errorAndStacktrace = pair; + await errorReportingService.recordError( + errorAndStacktrace.first, + errorAndStacktrace.last, + ); + }).sendPort, + ); + + runApp( + WonderWords( + remoteValueService: remoteValueService, + ), + ); + }, + (error, stack) => errorReportingService.recordError( + error, + stack, + fatal: true, + ), ); - log.i('Info Logger'); - log.d('Debug Logger'); - log.e('Error Logger'); - log.w('Warn Logger'); } class WonderWords extends StatefulWidget { - const WonderWords({Key? key}) : super(key: key); + const WonderWords({ + required this.remoteValueService, + Key? key, + }) : super(key: key); + + final RemoteValueService remoteValueService; @override _WonderWordsState createState() => _WonderWordsState(); @@ -43,6 +74,8 @@ class WonderWords extends StatefulWidget { class _WonderWordsState extends State { final _keyValueStorage = KeyValueStorage(); + final _analyticsService = AnalyticsService(); + final _dynamicLinkService = DynamicLinkService(); late final _favQsApi = FavQsApi( userTokenSupplier: () => _userRepository.getUserToken(), ); @@ -54,47 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ - ScreenViewObserver(), + ScreenViewObserver( + analyticsService: _analyticsService, + ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); - _openInitialDynamicLinkIfAny(); - _setupDynamicLinksListener(); - } - Future _setupDynamicLinksListener() async { - FirebaseDynamicLinks.instance.onLink( - onSuccess: ( - PendingDynamicLinkData? dynamicLink, - ) async { - final Uri? deepLink = dynamicLink?.link; + _openInitialDynamicLinkIfAny(); - if (deepLink != null) { - _navigator.push(deepLink.path); - } - }, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final PendingDynamicLinkData? data = - await FirebaseDynamicLinks.instance.getInitialLink(); - final Uri? deepLink = data?.link; - - if (deepLink != null) { - _navigator.push(deepLink.path); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); + if (path != null) { + _routerDelegate.push(path); } } @@ -104,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -111,27 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/routes.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/routes.dart deleted file mode 100644 index 988faaf8..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/routes.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/dynamic_link.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? ''), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => DynamicLink( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ).url, - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '$signInPath/sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/routing_table.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/screen_view_observer.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/screen_view_observer.dart index 97c7518b..ad8e53a3 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/screen_view_observer.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/screen_view_observer.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:monitoring/monitoring.dart'; import 'package:routemaster/routemaster.dart'; -typedef ScreenNameExtractor = String? Function(RouteSettings settings); - -String? defaultNameExtractor(RouteSettings settings) => settings.name; - class ScreenViewObserver extends RoutemasterObserver { ScreenViewObserver({ - this.nameExtractor = defaultNameExtractor, - Function(PlatformException error)? onError, - }) : _onError = onError; + required this.analyticsService, + }); + + final AnalyticsService analyticsService; + + void _sendScreenView(PageRoute route) { + final String? screenName = route.settings.name; - final ScreenNameExtractor nameExtractor; - final void Function(PlatformException error)? _onError; + if (screenName != null) { + analyticsService.setCurrentScreen(screenName); + } + } @override void didPush(Route route, Route? previousRoute) { @@ -31,24 +32,4 @@ class ScreenViewObserver extends RoutemasterObserver { _sendScreenView(previousRoute); } } - - @override - void didChangeRoute(RouteData routeData, Page page) {} - - void _sendScreenView(PageRoute route) { - final String? screenName = nameExtractor(route.settings); - if (screenName != null) { - analytics.setCurrentScreen(screenName: screenName).catchError( - (Object error) { - final _onError = this._onError; - if (_onError == null) { - log.e('$ScreenViewObserver: $error'); - } else { - _onError(error as PlatformException); - } - }, - test: (Object error) => error is PlatformException, - ); - } - } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/lib/home_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/lib/tab_container_screen.dart similarity index 92% rename from 11-create-your-own-widget-catalog/projects/challenge/lib/home_screen.dart rename to 11-create-your-own-widget-catalog/projects/challenge/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/lib/home_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/11-create-your-own-widget-catalog/projects/challenge/makefile b/11-create-your-own-widget-catalog/projects/challenge/makefile index 3f640d71..dd578f08 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/makefile +++ b/11-create-your-own-widget-catalog/projects/challenge/makefile @@ -10,6 +10,14 @@ print: echo $${package} ; \ done +pods-clean: + rm -Rf ios/Pods ; \ + rm -Rf ios/.symlinks ; \ + rm -Rf ios/Flutter/Flutter.framework ; \ + rm -Rf ios/Flutter/Flutter.podspec ; \ + rm ios/Podfile ; \ + rm ios/Podfile.lock ; \ + get: flutter pub get @@ -26,6 +34,21 @@ get: cd ../../ ; \ done +upgrade: + flutter pub upgrade + for feature in $(FEATURES); do \ + cd $${feature} ; \ + echo "Updating dependencies on $${feature}" ; \ + flutter pub upgrade ; \ + cd ../../../ ; \ + done + for package in $(PACKAGES); do \ + cd $${package} ; \ + echo "Updating dependencies on $${package}" ; \ + flutter pub upgrade ; \ + cd ../../ ; \ + done + lint: flutter analyze diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config.json deleted file mode 100644 index eeb05014..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config.json +++ /dev/null @@ -1 +0,0 @@ -{"configVersion":2,"packages":[{"name":"_fe_analyzer_shared","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"analyzer","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0","packageUri":"lib/","languageVersion":"2.14"},{"name":"archive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"args","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"auto_size_text","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"boolean_selector","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"characters","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"charcode","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"cli_util","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"clock","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"collection","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"convert","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"coverage","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"crypto","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"fake_async","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"file","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter","rootUri":"file:///Users/vid/flutter/packages/flutter","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_localizations","rootUri":"file:///Users/vid/flutter/packages/flutter_localizations","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_svg","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"flutter_test","rootUri":"file:///Users/vid/flutter/packages/flutter_test","packageUri":"lib/","languageVersion":"2.12"},{"name":"frontend_server_client","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"glob","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"graphs","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"http","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_multi_server","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"http_parser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"intl","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"io","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"js","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3","packageUri":"lib/","languageVersion":"2.12"},{"name":"lints","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"logging","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"lottie","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"matcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11","packageUri":"lib/","languageVersion":"2.12"},{"name":"material_color_utilities","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3","packageUri":"lib/","languageVersion":"2.13"},{"name":"meta","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mime","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"mocktail","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4","packageUri":"lib/","languageVersion":"2.12"},{"name":"node_preamble","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"package_config","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_drawing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"path_parsing","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"pedantic","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"petitparser","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pool","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"pub_semver","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"rive","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_packages_handler","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_static","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"shelf_web_socket","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"sky_engine","rootUri":"file:///Users/vid/flutter/bin/cache/pkg/sky_engine","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_map_stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_maps","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10","packageUri":"lib/","languageVersion":"2.12"},{"name":"source_span","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1","packageUri":"lib/","languageVersion":"2.12"},{"name":"stack_trace","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"stream_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"string_scanner","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"term_glyph","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"test","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5","packageUri":"lib/","languageVersion":"2.14"},{"name":"test_api","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8","packageUri":"lib/","languageVersion":"2.12"},{"name":"test_core","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9","packageUri":"lib/","languageVersion":"2.14"},{"name":"typed_data","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"vector_math","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1","packageUri":"lib/","languageVersion":"2.14"},{"name":"vm_service","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"watcher","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"web_socket_channel","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"webkit_inspection_protocol","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"xml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2","packageUri":"lib/","languageVersion":"2.12"},{"name":"yaml","rootUri":"file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0","packageUri":"lib/","languageVersion":"2.12"},{"name":"component_library","rootUri":"../","packageUri":"lib/","languageVersion":"2.14"},{"name":"flutter_gen","rootUri":"flutter_gen","languageVersion":"2.12"}],"generated":"2022-04-19T00:26:08.928495Z","generator":"pub","generatorVersion":"2.16.2"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config_subset deleted file mode 100644 index 8cb9e6c0..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/package_config_subset +++ /dev/null @@ -1,293 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.packages deleted file mode 100644 index 162deb93..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/.packages +++ /dev/null @@ -1,79 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:08.914199. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -component_library:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/closing-quote.svg b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/closing-quote.svg +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/opening-quote.svg b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/opening-quote.svg index 72e00372..c32e06de 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/opening-quote.svg +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/assets/opening-quote.svg @@ -1,16 +1 @@ - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/.metadata b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/.metadata +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj index deb66dee..30b65244 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -272,7 +272,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -346,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -395,7 +395,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner/Info.plist index a060db61..1579fb30 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner/Info.plist +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/ios/Runner/Info.plist @@ -41,5 +41,7 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart index f292aded..564cf939 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/lib/stories.dart @@ -163,14 +163,6 @@ List getStories(WonderThemeData theme) { : null, ), ), - Story.simple( - name: 'Loading Indicator', - section: 'Indicators', - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 200.0), - child: LoadingIndicator(), - ), - ), Story( name: 'QuoteCard', section: 'Quote', @@ -198,8 +190,8 @@ List getStories(WonderThemeData theme) { child: ListView.separated( itemCount: 15, itemBuilder: (_, __) => child, - separatorBuilder: (_, __) => Divider( - height: theme.listSpacing, + separatorBuilder: (_, __) => const Divider( + height: 16.0, ), ), ), @@ -245,6 +237,10 @@ List getStories(WonderThemeData theme) { ), ), ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), Story( name: 'Rounded Choice Chip', padding: const EdgeInsets.all( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/.gitignore b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/main.cc b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.cc b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/.gitignore b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 79% rename from 11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme rename to 11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 577477e2..fb7259e1 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/ios/Runner.xcodeproj/xcshareddata/xcschemes/prod.xcscheme +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -23,15 +23,15 @@ @@ -40,7 +40,7 @@ + buildConfiguration = "Debug"> diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Info.plist b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.lock index 3af732ee..10804f99 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.lock +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.lock @@ -1,27 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.6" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" boolean_selector: dependency: transitive description: @@ -35,28 +28,21 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -64,13 +50,6 @@ packages: relative: true source: path version: "0.0.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" device_frame: dependency: transitive description: @@ -84,7 +63,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -121,27 +100,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.15.0" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" intl: dependency: transitive description: @@ -155,7 +113,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.3.0" + version: "4.7.0" lints: dependency: transitive description: @@ -163,34 +121,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" nested: dependency: transitive description: @@ -204,7 +155,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -225,14 +176,14 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0" provider: dependency: transitive description: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.1" + version: "6.0.3" recase: dependency: transitive description: @@ -240,13 +191,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.32" sky_engine: dependency: transitive description: flutter @@ -258,7 +202,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -286,42 +230,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.12" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.1" + version: "5.4.1" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0 <3.0.0" flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.yaml index 638d550b..b295e253 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/pubspec.yaml @@ -1,4 +1,5 @@ name: component_library_storybook +version: 1.0.0+1 publish_to: none environment: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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:example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/.gitignore b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/Runner.rc b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/main.cpp b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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.CreateAndShow(L"example", 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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/resource.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.cpp b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/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/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.h b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/component_library.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/component_library.dart index 933e6f05..90c09be6 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/component_library.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/component_library.dart @@ -22,4 +22,3 @@ export 'src/theme/spacing.dart'; export 'src/theme/wonder_theme.dart'; export 'src/theme/wonder_theme_data.dart'; export 'src/upvote_icon_button.dart'; -export 'src/loading_indicator.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/count_indicator_icon_button.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/count_indicator_icon_button.dart index 83954a16..66558e26 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/count_indicator_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/count_indicator_icon_button.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class CountIndicatorIconButton extends StatefulWidget { +class CountIndicatorIconButton extends StatelessWidget { const CountIndicatorIconButton({ required this.count, required this.iconData, @@ -18,39 +17,26 @@ class CountIndicatorIconButton extends StatefulWidget { final String? tooltip; final VoidCallback? onTap; - @override - State createState() => - _CountIndicatorIconButtonState(); -} - -class _CountIndicatorIconButtonState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { @override Widget build(BuildContext context) { - return ScaleTransition( - scale: scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: widget.tooltip, - padding: const EdgeInsets.all(0), - icon: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - widget.iconData, - color: widget.iconColor, - ), - Text( - widget.count.toString(), - style: const TextStyle( - fontSize: FontSize.small, - ), + return IconButton( + onPressed: onTap, + tooltip: tooltip, + padding: const EdgeInsets.all(0), + icon: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + iconData, + color: iconColor, + ), + Text( + count.toString(), + style: const TextStyle( + fontSize: FontSize.small, ), - ], - ), + ), + ], ), ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/exception_indicator.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/exception_indicator.dart index ad6d74db..9a2259e8 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/exception_indicator.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/exception_indicator.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:rive/rive.dart'; class ExceptionIndicator extends StatelessWidget { const ExceptionIndicator({ @@ -26,15 +25,12 @@ class ExceptionIndicator extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const SizedBox( - height: 200, - child: RiveAnimation.asset( - 'assets/animations/on_off_switch.riv', - animations: ['Off'], - ), + const Icon( + Icons.error, + size: 48, ), const SizedBox( - height: Spacing.medium, + height: Spacing.xxLarge, ), Text( title ?? l10n.exceptionIndicatorGenericTitle, diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/favorite_icon_button.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/favorite_icon_button.dart index 51933644..44092c1d 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/favorite_icon_button.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/favorite_icon_button.dart @@ -1,7 +1,7 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -class FavoriteIconButton extends StatefulWidget { +class FavoriteIconButton extends StatelessWidget { const FavoriteIconButton({ required this.isFavorite, this.onTap, @@ -11,59 +11,14 @@ class FavoriteIconButton extends StatefulWidget { final bool isFavorite; final VoidCallback? onTap; - @override - State createState() => _FavoriteIconButtonState(); -} - -class _FavoriteIconButtonState extends State - with SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation _scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.8; - double partition = 0.7; - Duration duration = kThemeAnimationDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - _scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), - weight: partition, - ), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), - weight: 1 - partition, - ) - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } - @override Widget build(BuildContext context) { final l10n = ComponentLibraryLocalizations.of(context); - return ScaleTransition( - scale: _scaleAnimation, - child: IconButton( - onPressed: () { - widget.onTap?.call(); - animate(); - }, - tooltip: l10n.favoriteIconButtonTooltip, - icon: Icon( - widget.isFavorite ? Icons.favorite : Icons.favorite_border_outlined, - ), + return IconButton( + onPressed: onTap, + tooltip: l10n.favoriteIconButtonTooltip, + icon: Icon( + isFavorite ? Icons.favorite : Icons.favorite_border_outlined, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart index eca59dc4..9c334bc7 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -60,15 +60,18 @@ import 'component_library_localizations_en.dart'; /// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales /// property. abstract class ComponentLibraryLocalizations { - ComponentLibraryLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + ComponentLibraryLocalizations(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static ComponentLibraryLocalizations of(BuildContext context) { - return Localizations.of(context, ComponentLibraryLocalizations)!; + return Localizations.of( + context, ComponentLibraryLocalizations)!; } - static const LocalizationsDelegate delegate = _ComponentLibraryLocalizationsDelegate(); + static const LocalizationsDelegate delegate = + _ComponentLibraryLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -80,7 +83,8 @@ abstract class ComponentLibraryLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ + static const List> localizationsDelegates = + >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -89,7 +93,8 @@ abstract class ComponentLibraryLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @downvoteIconButtonTooltip. @@ -159,33 +164,37 @@ abstract class ComponentLibraryLocalizations { String get authenticationRequiredErrorSnackbarMessage; } -class _ComponentLibraryLocalizationsDelegate extends LocalizationsDelegate { +class _ComponentLibraryLocalizationsDelegate + extends LocalizationsDelegate { const _ComponentLibraryLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture(lookupComponentLibraryLocalizations(locale)); + return SynchronousFuture( + lookupComponentLibraryLocalizations(locale)); } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations lookupComponentLibraryLocalizations(Locale locale) { - - +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( + Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': return ComponentLibraryLocalizationsEn(); + case 'en': + return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( - 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' - ); + 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index abbb4044..bb2968c0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'component_library_localizations.dart'; /// The translations for English (`en`). @@ -32,11 +29,14 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { String get exceptionIndicatorTryAgainButton => 'Try Again'; @override - String get exceptionIndicatorGenericMessage => 'There has been an error.\nPlease, check your internet connection and try again later.'; + String get exceptionIndicatorGenericMessage => + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override - String get genericErrorSnackbarMessage => 'There has been an error. Please, check your internet connection.'; + String get genericErrorSnackbarMessage => + 'There has been an error. Please, check your internet connection.'; @override - String get authenticationRequiredErrorSnackbarMessage => 'You need to sign in before performing this action.'; + String get authenticationRequiredErrorSnackbarMessage => + 'You need to sign in before performing this action.'; } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/loading_indicator.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/loading_indicator.dart deleted file mode 100644 index 0f589516..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/loading_indicator.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:lottie/lottie.dart'; - -class LoadingIndicator extends StatelessWidget { - const LoadingIndicator({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 32, - horizontal: 16, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Lottie.asset('assets/animations/loader.json'), - ], - ), - ), - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/mixins/animation_mixin.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/mixins/animation_mixin.dart deleted file mode 100644 index 3dea8ef7..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/mixins/animation_mixin.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/material.dart'; - -mixin ScaleAnimationMixin - on SingleTickerProviderStateMixin { - late AnimationController _controller; - late Animation scaleAnimation; - - double scaleFrom = 1.0, scaleTo = 0.7; - double partition = 0.5; - Duration duration = kThemeChangeDuration; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: duration); - scaleAnimation = TweenSequence( - [ - TweenSequenceItem( - tween: Tween(begin: scaleFrom, end: scaleTo), weight: partition), - TweenSequenceItem( - tween: Tween(begin: scaleTo, end: scaleFrom), weight: partition), - ], - ).animate(_controller); - } - - void animate() { - if (_controller.isCompleted) { - _controller.reverse(); - } else { - _controller.forward(); - } - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/quote_card.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/quote_card.dart index f58fc2b1..5428cb36 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/quote_card.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/quote_card.dart @@ -44,10 +44,14 @@ class QuoteCard extends StatelessWidget { child: top, ), const Spacer(), - FavoriteIconButton( - isFavorite: isFavorite, - onTap: onFavorite, - ), + IconButton( + onPressed: onFavorite, + icon: Icon( + isFavorite + ? Icons.favorite + : Icons.favorite_border_outlined, + ), + ) ], ), Padding( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/rounded_choice_chip.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/rounded_choice_chip.dart index ad9327d7..46806b51 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/rounded_choice_chip.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/rounded_choice_chip.dart @@ -1,8 +1,7 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/mixins/animation_mixin.dart'; import 'package:flutter/material.dart'; -class RoundedChoiceChip extends StatefulWidget { +class RoundedChoiceChip extends StatelessWidget { const RoundedChoiceChip({ required this.label, required this.isSelected, @@ -24,44 +23,29 @@ class RoundedChoiceChip extends StatefulWidget { final Color? selectedBackgroundColor; final bool isSelected; - @override - State createState() => _RoundedChoiceChipState(); -} - -class _RoundedChoiceChipState extends State - with SingleTickerProviderStateMixin, ScaleAnimationMixin { - @override - double get scaleTo => 0.9; - @override Widget build(BuildContext context) { - final WonderThemeData theme = WonderTheme.of(context); - return ScaleTransition( - scale: scaleAnimation, - child: ChoiceChip( - shape: const StadiumBorder( - side: BorderSide(), - ), - avatar: widget.avatar, - label: Text( - widget.label, - style: TextStyle( - color: widget.isSelected - ? (widget.selectedLabelColor ?? - theme.roundedChoiceChipSelectedLabelColor) - : (widget.labelColor ?? theme.roundedChoiceChipLabelColor), - ), + final theme = WonderTheme.of(context); + return ChoiceChip( + shape: const StadiumBorder( + side: BorderSide(), + ), + avatar: avatar, + label: Text( + label, + style: TextStyle( + color: isSelected + ? (selectedLabelColor ?? + theme.roundedChoiceChipSelectedLabelColor) + : (labelColor ?? theme.roundedChoiceChipLabelColor), ), - onSelected: (isSelected) { - widget.onSelected?.call(isSelected); - animate(); - }, - selected: widget.isSelected, - backgroundColor: - (widget.backgroundColor ?? theme.roundedChoiceChipBackgroundColor), - selectedColor: (widget.selectedBackgroundColor ?? - theme.roundedChoiceChipSelectedBackgroundColor), ), + onSelected: onSelected, + selected: isSelected, + backgroundColor: + (backgroundColor ?? theme.roundedChoiceChipBackgroundColor), + selectedColor: (selectedBackgroundColor ?? + theme.roundedChoiceChipSelectedBackgroundColor), ); } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/theme/wonder_theme_data.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/theme/wonder_theme_data.dart index e938e794..fab49c3f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/lib/src/theme/wonder_theme_data.dart @@ -6,12 +6,6 @@ const _dividerThemeData = DividerThemeData( space: 0, ); -ElevatedButtonThemeData get buttonThemeData => ElevatedButtonThemeData( - style: ButtonStyle( - shape: const StadiumBorder().materialize(), - ), - ); - // If the number of properties get too big, we can start grouping them in // classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. abstract class WonderThemeData { @@ -19,14 +13,8 @@ abstract class WonderThemeData { double screenMargin = Spacing.mediumLarge; - double searchBarMargin = Spacing.xSmall; - double gridSpacing = Spacing.mediumLarge; - double listSpacing = Spacing.mediumLarge; - - double inputDecorationBorderRadius = Spacing.medium; - Color get roundedChoiceChipBackgroundColor; Color get roundedChoiceChipSelectedBackgroundColor; @@ -45,25 +33,6 @@ abstract class WonderThemeData { Color get votedButtonColor; - Color get textFieldBorderColor; - - MaterialColor get fabBackgroundColor; - - MaterialColor get fabForegroundColor; - - FloatingActionButtonThemeData get fabThemeData => - FloatingActionButtonThemeData( - backgroundColor: fabBackgroundColor.shade600, - foregroundColor: fabForegroundColor, - ); - - InputDecorationTheme get inputDecorationTheme => InputDecorationTheme( - border: OutlineInputBorder( - borderSide: BorderSide(color: textFieldBorderColor), - borderRadius: BorderRadius.circular(inputDecorationBorderRadius), - ), - ); - TextStyle quoteTextStyle = const TextStyle( fontFamily: 'Fondamento', package: 'component_library', @@ -76,9 +45,6 @@ class LightWonderThemeData extends WonderThemeData { brightness: Brightness.light, primarySwatch: Colors.black.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -107,15 +73,6 @@ class LightWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.black; - - @override - MaterialColor get fabBackgroundColor => Colors.black.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.white.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.black; } class DarkWonderThemeData extends WonderThemeData { @@ -125,9 +82,6 @@ class DarkWonderThemeData extends WonderThemeData { toggleableActiveColor: Colors.white, primarySwatch: Colors.white.toMaterialColor(), dividerTheme: _dividerThemeData, - floatingActionButtonTheme: fabThemeData, - elevatedButtonTheme: buttonThemeData, - inputDecorationTheme: inputDecorationTheme, ); @override @@ -156,15 +110,6 @@ class DarkWonderThemeData extends WonderThemeData { @override Color get votedButtonColor => Colors.white; - - @override - MaterialColor get fabBackgroundColor => Colors.white.toMaterialColor(); - - @override - MaterialColor get fabForegroundColor => Colors.black.toMaterialColor(); - - @override - Color get textFieldBorderColor => Colors.white; } extension on Color { @@ -186,9 +131,3 @@ extension on Color { _toSwatch(), ); } - -extension OutlinedBorderExtensions on OutlinedBorder { - MaterialStateProperty materialize() { - return MaterialStateProperty.all(this); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.lock deleted file mode 100644 index 6a3c9b3f..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: "direct main" - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: "direct main" - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: "direct main" - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-7.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.yaml index 0463ec20..d75f7082 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/pubspec.yaml @@ -9,10 +9,9 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter + intl: ^0.17.0 flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 - rive: ^0.7.28 - lottie: ^1.1.0 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config.json deleted file mode 100644 index 0f3617a0..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:17.509405Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config_subset deleted file mode 100644 index f37c3809..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/package_config_subset +++ /dev/null @@ -1,201 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.packages deleted file mode 100644 index 3a9b3101..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/.packages +++ /dev/null @@ -1,56 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:17.496589. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.16.8/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.19/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -domain_models:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/pubspec.lock deleted file mode 100644 index 095e6d55..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/domain_models/pubspec.lock +++ /dev/null @@ -1,348 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.6.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.10" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.8" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.19" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config.json deleted file mode 100644 index 43d1b750..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config.json +++ /dev/null @@ -1,440 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_serializable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:22.764340Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config_subset deleted file mode 100644 index dbe74cc6..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/package_config_subset +++ /dev/null @@ -1,289 +0,0 @@ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.packages deleted file mode 100644 index 20ec9ccb..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/.packages +++ /dev/null @@ -1,78 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:22.746626. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.1/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -json_serializable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_serializable-4.1.4/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -fav_qs_api:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.lock deleted file mode 100644 index 8f61c803..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.lock +++ /dev/null @@ -1,502 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.1" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.4" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/common_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config.json deleted file mode 100644 index 5244c972..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "forgot_my_password", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:41.230983Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config_subset deleted file mode 100644 index 755ca6d0..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -forgot_my_password -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/forgot_my_password/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins-dependencies deleted file mode 100644 index 47d64ded..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:41.452138","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.packages deleted file mode 100644 index 8a741b63..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:41.197965. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -forgot_my_password:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart index 49ca8b27..f40a9e51 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart @@ -19,13 +19,13 @@ class ForgotMyPasswordCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), ); @@ -35,7 +35,7 @@ class ForgotMyPasswordCubit extends Cubit { void onEmailUnfocused() { final newState = state.copyWith( - email: Email.dirty( + email: Email.validated( state.email.value, ), ); @@ -43,10 +43,10 @@ class ForgotMyPasswordCubit extends Cubit { } void onSubmit() async { - final email = Email.dirty(state.email.value); + final email = Email.validated(state.email.value); final newState = state.copyWith( email: email, - status: email.valid ? FormzStatus.submissionInProgress : state.status, + submissionStatus: email.valid ? SubmissionStatus.inProgress : null, ); emit(newState); if (email.valid) { @@ -55,12 +55,12 @@ class ForgotMyPasswordCubit extends Cubit { email.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, + submissionStatus: SubmissionStatus.success, ); emit(newState); - } catch (error) { + } catch (_) { final newState = state.copyWith( - status: FormzStatus.submissionFailure, + submissionStatus: SubmissionStatus.error, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart index 846998db..4be5eef2 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart @@ -66,7 +66,7 @@ class _ForgotMyPasswordViewState extends State { final l10n = ForgotMyPasswordLocalizations.of(context); return BlocConsumer( listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -86,7 +86,7 @@ class _ForgotMyPasswordViewState extends State { builder: (context, state) { final cubit = context.read(); final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final emailError = state.email.invalid ? state.email.error : null; return GestureDetector( onTap: () => _releaseFocus(context), @@ -100,6 +100,7 @@ class _ForgotMyPasswordViewState extends State { enabled: !isSubmissionInProgress, onEditingComplete: cubit.onSubmit, onChanged: cubit.onEmailChanged, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -113,18 +114,18 @@ class _ForgotMyPasswordViewState extends State { : l10n.emailTextFieldInvalidErrorMessage), ), ), - if (state.status.isSubmissionFailure) + if (state.submissionStatus == SubmissionStatus.error) ...[ const SizedBox( height: Spacing.medium, ), - if (state.status.isSubmissionFailure) Text( l10n.errorMessage, style: const TextStyle( color: Colors.red, fontSize: FontSize.medium, ), - ) + ), + ], ], ), actions: [ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart index 7701b4a5..333d7041 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart @@ -2,27 +2,34 @@ part of 'forgot_my_password_cubit.dart'; class ForgotMyPasswordState extends Equatable { const ForgotMyPasswordState({ - this.email = const Email.pure(), - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; - final FormzStatus status; + final SubmissionStatus submissionStatus; ForgotMyPasswordState copyWith({ Email? email, Password? password, - FormzStatus? status, + SubmissionStatus? submissionStatus, }) { return ForgotMyPasswordState( email: email ?? this.email, - status: status ?? this.status, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ email, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.lock deleted file mode 100644 index 37d2f6c8..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: transitive - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.yaml index da9acf75..fc6d79ab 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/forgot_my_password/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config.json deleted file mode 100644 index 6ca4a7dc..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config.json +++ /dev/null @@ -1,608 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "profile_menu", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:44.949230Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config_subset deleted file mode 100644 index dba1cbdf..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/package_config_subset +++ /dev/null @@ -1,401 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -profile_menu -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/profile_menu/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins-dependencies deleted file mode 100644 index ff49de10..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:45.163726","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.packages deleted file mode 100644 index 1756cc86..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/.packages +++ /dev/null @@ -1,106 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:44.916586. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -profile_menu:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_en.arb index 12093a3b..2089593b 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_en.arb @@ -13,5 +13,7 @@ "darkModePreferencesAlwaysDarkTileLabel": "Always Dark", "darkModePreferencesAlwaysLightTileLabel": "Always Light", "darkModePreferencesUseSystemSettingsTileLabel": "Use System Settings", - "signOutButtonLabel": "Sign Out" + "signOutButtonLabel": "Sign Out", + "signUpOpeningText": "Don't have an account?", + "signUpButtonLabel": "Sign up" } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index d4904a02..71f77a0c 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -140,6 +144,18 @@ abstract class ProfileMenuLocalizations { /// In en, this message translates to: /// **'Sign Out'** String get signOutButtonLabel; + + /// No description provided for @signUpOpeningText. + /// + /// In en, this message translates to: + /// **'Don\'t have an account?'** + String get signUpOpeningText; + + /// No description provided for @signUpButtonLabel. + /// + /// In en, this message translates to: + /// **'Sign up'** + String get signUpButtonLabel; } class _ProfileMenuLocalizationsDelegate @@ -149,22 +165,24 @@ class _ProfileMenuLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupProfileMenuLocalizations(locale)); + lookupProfileMenuLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; } -ProfileMenuLocalizations _lookupProfileMenuLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart index bc456b36..098adb27 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart @@ -30,4 +30,10 @@ class ProfileMenuLocalizationsEn extends ProfileMenuLocalizations { @override String get signOutButtonLabel => 'Sign Out'; + + @override + String get signUpOpeningText => 'Don\'t have an account?'; + + @override + String get signUpButtonLabel => 'Sign up'; } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart index eeda3d0c..e3017b85 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,23 +1,27 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, required this.quoteRepository, this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; final VoidCallback? onUpdateProfileTap; + final VoidCallback? onSignUpTap; final UserRepository userRepository; final QuoteRepository quoteRepository; @@ -31,6 +35,7 @@ class ProfileMenuScreen extends StatelessWidget { child: ProfileMenuView( onSignInTap: onSignInTap, onUpdateProfileTap: onUpdateProfileTap, + onSignUpTap: onSignUpTap, ), ); } @@ -40,11 +45,13 @@ class ProfileMenuScreen extends StatelessWidget { class ProfileMenuView extends StatelessWidget { const ProfileMenuView({ this.onSignInTap, + this.onSignUpTap, this.onUpdateProfileTap, Key? key, }) : super(key: key); final VoidCallback? onSignInTap; + final VoidCallback? onSignUpTap; final VoidCallback? onUpdateProfileTap; @override @@ -59,10 +66,26 @@ class ProfileMenuView extends StatelessWidget { final username = state.username; return Column( children: [ - if (!state.isUserAuthenticated) + if (!state.isUserAuthenticated) ...[ _SignInButton( onSignInTap: onSignInTap, ), + const SizedBox( + height: Spacing.xLarge, + ), + Text( + l10n.signUpOpeningText, + ), + TextButton( + child: Text( + l10n.signUpButtonLabel, + ), + onPressed: onSignUpTap, + ), + const SizedBox( + height: Spacing.large, + ), + ], if (username != null) ...[ Expanded( child: Center( @@ -124,9 +147,10 @@ class _SignInButton extends StatelessWidget { final theme = WonderTheme.of(context); final l10n = ProfileMenuLocalizations.of(context); return Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - vertical: Spacing.xxLarge, + padding: EdgeInsets.only( + left: theme.screenMargin, + right: theme.screenMargin, + top: Spacing.xxLarge, ), child: ExpandedElevatedButton( onTap: onSignInTap, diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.lock deleted file mode 100644 index 4291e695..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.lock +++ /dev/null @@ -1,691 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: "direct main" - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.yaml index c9d1921a..8f33a7c1 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/profile_menu/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: intl: ^0.17.0 quote_repository: path: ../../quote_repository - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository domain_models: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config.json deleted file mode 100644 index 603576cb..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config.json +++ /dev/null @@ -1,668 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "share_plus_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "url_launcher_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_details", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:50.124357Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config_subset deleted file mode 100644 index b87e785f..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/package_config_subset +++ /dev/null @@ -1,441 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -quote_details -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_details/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins deleted file mode 100644 index b3a1e738..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins +++ /dev/null @@ -1,13 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -share_plus=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/ -share_plus_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/ -share_plus_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/ -url_launcher=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/ -url_launcher_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/ -url_launcher_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/ -url_launcher_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/ -url_launcher_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins-dependencies deleted file mode 100644 index 4fcebc66..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]},{"name":"share_plus","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/","dependencies":[]},{"name":"url_launcher","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]},{"name":"share_plus_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/","dependencies":[]}],"web":[{"name":"share_plus_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"share_plus","dependencies":["share_plus_macos","share_plus_web"]},{"name":"share_plus_macos","dependencies":[]},{"name":"share_plus_web","dependencies":["url_launcher"]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:50.331649","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.packages deleted file mode 100644 index 479d1b42..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/.packages +++ /dev/null @@ -1,116 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:50.100337. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -share_plus:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus-2.1.4/lib/ -share_plus_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_linux-2.0.3/lib/ -share_plus_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_macos-2.0.2/lib/ -share_plus_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_platform_interface-2.0.1/lib/ -share_plus_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_web-2.0.4/lib/ -share_plus_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/share_plus_windows-2.0.3/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -url_launcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.9/lib/ -url_launcher_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-2.0.1/lib/ -url_launcher_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-2.0.1/lib/ -url_launcher_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_platform_interface-2.0.4/lib/ -url_launcher_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-2.0.2/lib/ -url_launcher_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-2.0.1/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_details:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/l10n.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/quote_details.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/quote_details.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_cubit.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_cubit.dart index eb3f094e..597cc6ce 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_cubit.dart @@ -31,7 +31,7 @@ class QuoteDetailsCubit extends Cubit { } } - void refresh() { + Future refetch() async { emit( const QuoteDetailsInProgress(), ); @@ -39,37 +39,37 @@ class QuoteDetailsCubit extends Cubit { _fetchQuoteDetails(); } - void upvoteQuote() { - _executeQuoteUpdateOperation( + void upvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.upvoteQuote(quoteId), ); } - void downvoteQuote() { - _executeQuoteUpdateOperation( + void downvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.downvoteQuote(quoteId), ); } - void unvoteQuote() { - _executeQuoteUpdateOperation( + void unvoteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unvoteQuote(quoteId), ); } - void favoriteQuote() { - _executeQuoteUpdateOperation( + void favoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.favoriteQuote(quoteId), ); } - void unfavoriteQuote() { - _executeQuoteUpdateOperation( + void unfavoriteQuote() async { + await _executeQuoteUpdateOperation( () => quoteRepository.unfavoriteQuote(quoteId), ); } - void _executeQuoteUpdateOperation( + Future _executeQuoteUpdateOperation( Future Function() updateQuote, ) async { try { @@ -85,7 +85,7 @@ class QuoteDetailsCubit extends Cubit { emit( QuoteDetailsSuccess( quote: lastState.quote, - eventError: error, + quoteUpdateError: error, ), ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart index 6690a7f0..c4242afc 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/src/l10n/quote_details_localizations.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,105 +43,64 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { - final theme = WonderTheme.of(context); return StyledStatusBar.dark( child: BlocConsumer( listener: (context, state) { - final eventError = - state is QuoteDetailsSuccess ? state.eventError : null; - if (eventError != null) { - final snackBar = eventError is UserAuthenticationRequiredException - ? const AuthenticationRequiredErrorSnackBar() - : const GenericErrorSnackBar(); + final quoteUpdateError = + state is QuoteDetailsSuccess ? state.quoteUpdateError : null; + if (quoteUpdateError != null) { + final snackBar = + quoteUpdateError is UserAuthenticationRequiredException + ? const AuthenticationRequiredErrorSnackBar() + : const GenericErrorSnackBar(); ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(snackBar); - if (eventError is UserAuthenticationRequiredException) { + if (quoteUpdateError is UserAuthenticationRequiredException) { onAuthenticationError(); } } }, builder: (context, state) { - final quote = state is QuoteDetailsSuccess ? state.quote : null; - final cubit = context.read(); return WillPopScope( onWillPop: () async { - Navigator.of(context).pop(quote); + final displayedQuote = + state is QuoteDetailsSuccess ? state.quote : null; + Navigator.of(context).pop(displayedQuote); return false; }, child: Scaffold( - appBar: RowAppBar( - children: [ - if (quote != null) ...[ - FavoriteIconButton( - isFavorite: quote.isFavorite ?? false, - onTap: () { - if (quote.isFavorite == true) { - cubit.unfavoriteQuote(); - } else { - cubit.favoriteQuote(); - } - }, - ), - UpvoteIconButton( - count: quote.upvotesCount, - isUpvoted: quote.isUpvoted ?? false, - onTap: () { - if (quote.isUpvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.upvoteQuote(); - } - }, - ), - DownvoteIconButton( - count: quote.downvotesCount, - isDownvoted: quote.isDownvoted ?? false, - onTap: () { - if (quote.isDownvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.downvoteQuote(); - } - }, - ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( - url, - ), - ); - }, - ), - ] - ], - ), + appBar: state is QuoteDetailsSuccess + ? _QuoteActionsAppBar( + quote: state.quote, + shareableLinkGenerator: shareableLinkGenerator, + ) + : null, body: SafeArea( child: Padding( padding: EdgeInsets.all( - theme.screenMargin, + WonderTheme.of(context).screenMargin, ), - child: quote != null + child: state is QuoteDetailsSuccess ? _Quote( - quote: quote, + quote: state.quote, ) : state is QuoteDetailsFailure ? ExceptionIndicator( onTryAgain: () { - cubit.refresh(); + final cubit = context.read(); + cubit.refetch(); }, ) : const CenteredCircularProgressIndicator(), @@ -156,6 +114,72 @@ class QuoteDetailsView extends StatelessWidget { } } +class _QuoteActionsAppBar extends StatelessWidget + implements PreferredSizeWidget { + const _QuoteActionsAppBar({ + required this.quote, + this.shareableLinkGenerator, + Key? key, + }) : super(key: key); + + final Quote quote; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; + + @override + Widget build(BuildContext context) { + final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; + return RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: quote.isFavorite ?? false, + onTap: () { + if (quote.isFavorite == true) { + cubit.unfavoriteQuote(); + } else { + cubit.favoriteQuote(); + } + }, + ), + UpvoteIconButton( + count: quote.upvotesCount, + isUpvoted: quote.isUpvoted ?? false, + onTap: () { + if (quote.isUpvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.upvoteQuote(); + } + }, + ), + DownvoteIconButton( + count: quote.downvotesCount, + isDownvoted: quote.isDownvoted ?? false, + onTap: () { + if (quote.isDownvoted == true) { + cubit.unvoteQuote(); + } else { + cubit.downvoteQuote(); + } + }, + ), + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( + url, + ); + }, + ), + ], + ); + } + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} + class _Quote extends StatelessWidget { static const double _quoteIconWidth = 46; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_state.dart index 229d6375..f89c5c92 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/lib/src/quote_details_state.dart @@ -2,31 +2,34 @@ part of 'quote_details_cubit.dart'; abstract class QuoteDetailsState extends Equatable { const QuoteDetailsState(); - - @override - List get props => []; } class QuoteDetailsInProgress extends QuoteDetailsState { const QuoteDetailsInProgress(); + + @override + List get props => []; } class QuoteDetailsSuccess extends QuoteDetailsState { const QuoteDetailsSuccess({ required this.quote, - this.eventError, + this.quoteUpdateError, }); final Quote quote; - final dynamic eventError; + final dynamic quoteUpdateError; @override List get props => [ quote, - eventError, + quoteUpdateError, ]; } class QuoteDetailsFailure extends QuoteDetailsState { const QuoteDetailsFailure(); + + @override + List get props => []; } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.lock deleted file mode 100644 index 551ad252..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.lock +++ /dev/null @@ -1,759 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - share_plus: - dependency: "direct main" - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.4" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.9" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.yaml index 856ced49..5f16c003 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_details/pubspec.yaml @@ -8,8 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 - share_plus: ^2.1.4 + flutter_bloc: ^8.0.1 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config.json deleted file mode 100644 index 6ddd7e74..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config.json +++ /dev/null @@ -1,626 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_staggered_grid_view", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "infinite_scroll_pagination", - "rootUri": "file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../../../quote_repository", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sliver_tools", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_list", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:53.929898Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config_subset deleted file mode 100644 index 569af0b5..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/package_config_subset +++ /dev/null @@ -1,413 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -quote_list -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/quote_list/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -infinite_scroll_pagination -2.12 -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/ -file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sliver_tools -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins-dependencies deleted file mode 100644 index e69dd80c..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:54.172364","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.packages deleted file mode 100644 index 3e7cae90..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/.packages +++ /dev/null @@ -1,109 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:53.902060. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_staggered_grid_view:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_staggered_grid_view-0.4.0/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -infinite_scroll_pagination:file:///Users/vid/flutter/.pub-cache/git/infinite_scroll_pagination-cd75af58e17f385218425c96a2baceee08bb086a/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -quote_repository:../../quote_repository/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -sliver_tools:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/sliver_tools-0.2.5/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_list:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart index 22ffba03..2ccb5ec1 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:bloc_concurrency/bloc_concurrency.dart'; import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -19,23 +20,17 @@ class QuoteListBloc extends Bloc { super( const QuoteListState(), ) { - _registerEventHandler(); + _registerEventsHandler(); - add( - const QuoteListFirstPageRequested(), - ); + _authChangesSubscription = userRepository.getUser().listen( + (user) { + _authenticatedUsername = user?.username; - _authChangesSubscription = userRepository - .getUser() - .where( - (user) => user?.username != _authenticatedUsername, - ) - .listen((user) { - _authenticatedUsername = user?.username; - add( - const QuoteListUserAuthenticationChanged(), - ); - }); + add( + const QuoteListUsernameObtained(), + ); + }, + ); } late final StreamSubscription _authChangesSubscription; @@ -43,138 +38,277 @@ class QuoteListBloc extends Bloc { String? _authenticatedUsername; final QuoteRepository _quoteRepository; - void _registerEventHandler() { + void _registerEventsHandler() { on( - (event, emit) async { - if (event is QuoteListFirstPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + (event, emitter) async { + if (event is QuoteListUsernameObtained) { + await _handleQuoteListUsernameObtained(emitter); + } else if (event is QuoteListFailedFetchRetried) { + await _handleQuoteListFailedFetchRetried(emitter); } else if (event is QuoteListItemUpdated) { - emit( - state.copyWithUpdatedQuote(event.updatedQuote), - ); - } else if (event is QuoteListUserAuthenticationChanged) { - emit( - QuoteListState( - filter: state.filter, - ), - ); - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ), - onData: emit, - ); + _handleQuoteListItemUpdated(emitter, event); } else if (event is QuoteListTagChanged) { - emit( - QuoteListState.loadingNewTag(tag: event.tag), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListTagChanged(emitter, event); } else if (event is QuoteListSearchTermChanged) { - emit( - QuoteListState.loadingNewSearchTerm( - searchTerm: event.searchTerm, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); + await _handleQuoteListSearchTermChanged(emitter, event); } else if (event is QuoteListRefreshed) { - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - isRefresh: true, - ), - onData: emit, - ); - } else if (event is QuoteListNewPageRequested) { - emit( - state.copyWithNewError(null), - ); - - await emit.onEach( - _fetchQuotePage( - event.pageNumber, - fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, - ), - onData: emit, - ); + await _handleQuoteListRefreshed(emitter, event); + } else if (event is QuoteListNextPageRequested) { + await _handleQuoteListNextPageRequested(emitter, event); } else if (event is QuoteListItemFavoriteToggled) { - try { - final updatedQuote = await (event is QuoteListItemFavorited - ? _quoteRepository.favoriteQuote(event.id) - : _quoteRepository.unfavoriteQuote(event.id)); - final isFilteringByFavorites = - state.filter is QuoteListFilterByFavorites; - if (!isFilteringByFavorites) { - emit( - state.copyWithUpdatedQuote(updatedQuote), - ); - } else { - emit( - QuoteListState( - filter: state.filter, - ), - ); - - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - ), - onData: emit, - ); - } - } catch (error) { - emit( - state.copyWithFavoriteToggleError(error), - ); - } + await _handleQuoteListItemFavoriteToggled(emitter, event); } else if (event is QuoteListFilterByFavoritesToggled) { - final isFilteringByFavorites = - state.filter is! QuoteListFilterByFavorites; + await _handleQuoteListFilterByFavoritesToggled(emitter); + } + }, + transformer: (eventStream, eventHandler) { + final nonDebounceEventStream = eventStream.where( + (event) => event is! QuoteListSearchTermChanged, + ); - emit( - QuoteListState.loadingToggledFavoritesFilter( - isFilteringByFavorites: isFilteringByFavorites, - ), - ); + final debounceEventStream = eventStream + .whereType() + .debounceTime( + const Duration(seconds: 1), + ) + .where((event) { + final previousFilter = state.filter; + final previousSearchTerm = + previousFilter is QuoteListFilterBySearchTerm + ? previousFilter.searchTerm + : ''; - await emit.onEach( - _fetchQuotePage( - 1, - fetchPolicy: isFilteringByFavorites - ? QuoteListPageFetchPolicy.cacheAndNetwork - : QuoteListPageFetchPolicy.cachePreferably, - ), - onData: emit, - ); - } + return event.searchTerm != previousSearchTerm; + }); + + final mergedEventStream = MergeStream([ + nonDebounceEventStream, + debounceEventStream, + ]); + + final restartableTransformer = restartable(); + return restartableTransformer(mergedEventStream, eventHandler); }, - transformer: _transformEvents, + ); + } + + Future _handleQuoteListFailedFetchRetried(Emitter emitter) { + // Clears out the error and puts the loading indicator back on the screen. + emitter( + state.copyWithNewError(null), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + void _handleQuoteListItemUpdated( + Emitter emitter, + QuoteListItemUpdated event, + ) { + // Replaces the updated quote in the current state and re-emits it. + emitter( + state.copyWithUpdatedQuote( + event.updatedQuote, + ), + ); + } + + Future _handleQuoteListUsernameObtained(Emitter emitter) { + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListTagChanged( + Emitter emitter, + QuoteListTagChanged event, + ) { + emitter( + QuoteListState.loadingNewTag(tag: event.tag), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *deselecting* a tag, the `cachePreferably` fetch policy + // will return you the cached quotes. If the user is selecting a new tag + // instead, the `cachePreferably` fetch policy won't find any cached + // quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListSearchTermChanged( + Emitter emitter, + QuoteListSearchTermChanged event, + ) { + emitter( + QuoteListState.loadingNewSearchTerm( + searchTerm: event.searchTerm, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *clearing out* the search bar, the `cachePreferably` + // fetch policy will return you the cached quotes. If the user is + // entering a new search instead, the `cachePreferably` fetch policy + // won't find any cached quotes and will instead use the network. + fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListRefreshed( + Emitter emitter, + QuoteListRefreshed event, + ) { + final firstPageFetchStream = _fetchQuotePage( + 1, + // Since the user is asking for a refresh, you don't want to get cached + // quotes, thus the `networkOnly` fetch policy makes the most sense. + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + isRefresh: true, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListNextPageRequested( + Emitter emitter, + QuoteListNextPageRequested event, + ) { + emitter( + state.copyWithNewError(null), + ); + + final nextPageFetchStream = _fetchQuotePage( + event.pageNumber, + // The `networkPreferably` fetch policy prioritizes fetching the new page + // from the server, and, if it fails, try grabbing it from the cache. + fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, + ); + + return emitter.onEach( + nextPageFetchStream, + onData: emitter, + ); + } + + Future _handleQuoteListItemFavoriteToggled( + Emitter emitter, + QuoteListItemFavoriteToggled event, + ) async { + try { + // The `favoriteQuote()` and `unfavoriteQuote()` functions return you the + // updated quote object. + final updatedQuote = await (event is QuoteListItemFavorited + ? _quoteRepository.favoriteQuote( + event.id, + ) + : _quoteRepository.unfavoriteQuote( + event.id, + )); + final isFilteringByFavorites = state.filter is QuoteListFilterByFavorites; + + // If the user isn't filtering by favorites, you just replace the changed + // quote on-screen. + if (!isFilteringByFavorites) { + emitter( + state.copyWithUpdatedQuote( + updatedQuote, + ), + ); + } else { + // If the user *is* filtering by favorites, that means the user is + // actually *removing* a quote from the list, so you refresh the entire + // list to make sure you won't break the pagination. + emitter( + QuoteListState( + filter: state.filter, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + fetchPolicy: QuoteListPageFetchPolicy.networkOnly, + ); + + await emitter.onEach( + firstPageFetchStream, + onData: emitter, + ); + } + } catch (error) { + // If an error happens trying to (un)favorite a quote you attach an error + // to the current state which will result on the screen showing a snackbar + // to the user and possibly taking him to the Sign In screen in case the + // cause is the user being signed out. + emitter( + state.copyWithFavoriteToggleError( + error, + ), + ); + } + } + + Future _handleQuoteListFilterByFavoritesToggled( + Emitter emitter, + ) { + final isFilteringByFavorites = state.filter is! QuoteListFilterByFavorites; + + emitter( + QuoteListState.loadingToggledFavoritesFilter( + isFilteringByFavorites: isFilteringByFavorites, + ), + ); + + final firstPageFetchStream = _fetchQuotePage( + 1, + // If the user is *adding* the favorites filter, you use the *cacheAndNetwork* + // fetch policy to show the cached data first followed by the updated list + // from the server. + // If the user is *removing* the favorites filter, you simply show the + // cached data they were seeing before applying the filter. + fetchPolicy: isFilteringByFavorites + ? QuoteListPageFetchPolicy.cacheAndNetwork + : QuoteListPageFetchPolicy.cachePreferably, + ); + + return emitter.onEach( + firstPageFetchStream, + onData: emitter, ); } @@ -183,83 +317,65 @@ class QuoteListBloc extends Bloc { required QuoteListPageFetchPolicy fetchPolicy, bool isRefresh = false, }) async* { - final filter = state.filter; - final isFilteringByFavorites = filter is QuoteListFilterByFavorites; - if (isFilteringByFavorites && _authenticatedUsername == null) { + final currentlyAppliedFilter = state.filter; + final isFilteringByFavorites = + currentlyAppliedFilter is QuoteListFilterByFavorites; + final isUserSignedIn = _authenticatedUsername != null; + if (isFilteringByFavorites && !isUserSignedIn) { yield QuoteListState.noItemsFound( - filter: state.filter, + filter: currentlyAppliedFilter, ); } else { - yield* _quoteRepository - .getQuoteListPage( + final pagesStream = _quoteRepository.getQuoteListPage( page, - tag: filter is QuoteListFilterByTag ? filter.tag : null, - searchTerm: - filter is QuoteListFilterBySearchTerm ? filter.searchTerm : '', - favoritedByUsername: filter is QuoteListFilterByFavorites - ? _authenticatedUsername + tag: currentlyAppliedFilter is QuoteListFilterByTag + ? currentlyAppliedFilter.tag : null, + searchTerm: currentlyAppliedFilter is QuoteListFilterBySearchTerm + ? currentlyAppliedFilter.searchTerm + : '', + favoritedByUsername: + currentlyAppliedFilter is QuoteListFilterByFavorites + ? _authenticatedUsername + : null, fetchPolicy: fetchPolicy, - ) - .map( - (newPage) { - return newPage.toQuoteListState( - page, - state, - isRefresh: page != state.nextPage, - ); - }, - ).onErrorReturnWith( - (error, _) { - if (error is EmptySearchResultException) { - return QuoteListState.noItemsFound( - filter: state.filter, - ); - } - - if (isRefresh) { - return state.copyWithNewRefreshError( - error, - ); - } else { - return state.copyWithNewError( - error, - ); - } - }, ); - } - } - Stream _transformEvents( - Stream events, - EventMapper mapper, - ) { - final nonDebounceEventStream = events.where( - (event) => event is! QuoteListSearchTermChanged, - ); + try { + await for (final newPage in pagesStream) { + final newItemList = newPage.quoteList; + final oldItemList = state.itemList ?? []; + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); + + final nextPage = newPage.isLastPage ? null : page + 1; + + yield QuoteListState.success( + nextPage: nextPage, + itemList: completeItemList, + filter: currentlyAppliedFilter, + isRefresh: isRefresh, + ); + } + } catch (error) { + if (error is EmptySearchResultException) { + yield QuoteListState.noItemsFound( + filter: currentlyAppliedFilter, + ); + } - final debounceEventStream = events - .whereType() - .debounceTime( - const Duration(seconds: 1), - ) - .where((event) { - final previousFilter = state.filter; - final previousSearchTerm = previousFilter is QuoteListFilterBySearchTerm - ? previousFilter.searchTerm - : ''; - - return event.searchTerm != previousSearchTerm; - }); - - final mergedEventStream = MergeStream([ - nonDebounceEventStream, - debounceEventStream, - ]); - - // Explanation: https://stackoverflow.com/questions/61569917/how-do-i-nest-streams-in-dart-map-streams-to-stream-events - return mergedEventStream.switchMap(mapper); + if (isRefresh) { + yield state.copyWithNewRefreshError( + error, + ); + } else { + yield state.copyWithNewError( + error, + ); + } + } + } } @override @@ -268,23 +384,3 @@ class QuoteListBloc extends Bloc { return super.close(); } } - -extension on QuoteListPage { - QuoteListState toQuoteListState( - int page, - QuoteListState lastState, { - bool isRefresh = false, - }) { - final newItemList = quoteList; - final nextPage = isLastPage ? null : page + 1; - - final oldItemList = lastState.itemList ?? []; - - return QuoteListState.success( - nextPage: nextPage, - itemList: isRefresh ? newItemList : [...oldItemList, ...newItemList], - filter: lastState.filter, - isRefresh: isRefresh, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_event.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_event.dart index 963317fe..f7b7701f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_event.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_event.dart @@ -7,18 +7,10 @@ abstract class QuoteListEvent extends Equatable { List get props => []; } -class QuoteListFirstPageRequested extends QuoteListEvent { - const QuoteListFirstPageRequested(); -} - class QuoteListFilterByFavoritesToggled extends QuoteListEvent { const QuoteListFilterByFavoritesToggled(); } -class QuoteListUserAuthenticationChanged extends QuoteListEvent { - const QuoteListUserAuthenticationChanged(); -} - class QuoteListTagChanged extends QuoteListEvent { const QuoteListTagChanged( this.tag, @@ -49,8 +41,8 @@ class QuoteListRefreshed extends QuoteListEvent { const QuoteListRefreshed(); } -class QuoteListNewPageRequested extends QuoteListEvent { - const QuoteListNewPageRequested({ +class QuoteListNextPageRequested extends QuoteListEvent { + const QuoteListNextPageRequested({ required this.pageNumber, }); @@ -58,11 +50,33 @@ class QuoteListNewPageRequested extends QuoteListEvent { } abstract class QuoteListItemFavoriteToggled extends QuoteListEvent { - const QuoteListItemFavoriteToggled(this.id); + const QuoteListItemFavoriteToggled( + this.id, + ); final int id; } +class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemFavorited( + int id, + ) : super(id); +} + +class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { + const QuoteListItemUnfavorited( + int id, + ) : super(id); +} + +class QuoteListFailedFetchRetried extends QuoteListEvent { + const QuoteListFailedFetchRetried(); +} + +class QuoteListUsernameObtained extends QuoteListEvent { + const QuoteListUsernameObtained(); +} + class QuoteListItemUpdated extends QuoteListEvent { const QuoteListItemUpdated( this.updatedQuote, @@ -70,11 +84,3 @@ class QuoteListItemUpdated extends QuoteListEvent { final Quote updatedQuote; } - -class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemFavorited(int id) : super(id); -} - -class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemUnfavorited(int id) : super(id); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart index 4ed8d79b..0d4e77a5 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -3,10 +3,12 @@ import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -17,12 +19,14 @@ class QuoteListScreen extends StatelessWidget { required this.quoteRepository, required this.userRepository, required this.onAuthenticationError, + required this.remoteValueService, this.onQuoteSelected, Key? key, }) : super(key: key); final QuoteRepository quoteRepository; final UserRepository userRepository; + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -36,6 +40,7 @@ class QuoteListScreen extends StatelessWidget { child: QuoteListView( onAuthenticationError: onAuthenticationError, onQuoteSelected: onQuoteSelected, + remoteValueService: remoteValueService, ), ); } @@ -44,11 +49,13 @@ class QuoteListScreen extends StatelessWidget { @visibleForTesting class QuoteListView extends StatefulWidget { const QuoteListView({ + required this.remoteValueService, required this.onAuthenticationError, this.onQuoteSelected, Key? key, }) : super(key: key); + final RemoteValueService remoteValueService; final QuoteSelected? onQuoteSelected; final void Function(BuildContext context) onAuthenticationError; @@ -57,20 +64,22 @@ class QuoteListView extends StatefulWidget { } class _QuoteListViewState extends State { + // For a deep dive on PagingController refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter final PagingController _pagingController = PagingController( firstPageKey: 1, ); final TextEditingController _searchBarController = TextEditingController(); + QuoteListBloc get _bloc => context.read(); + @override void initState() { _pagingController.addPageRequestListener((pageNumber) { final isSubsequentPage = pageNumber > 1; if (isSubsequentPage) { - final bloc = context.read(); - bloc.add( - QuoteListNewPageRequested( + _bloc.add( + QuoteListNextPageRequested( pageNumber: pageNumber, ), ); @@ -78,8 +87,7 @@ class _QuoteListViewState extends State { }); _searchBarController.addListener(() { - final bloc = context.read(); - bloc.add( + _bloc.add( QuoteListSearchTermChanged( _searchBarController.text, ), @@ -130,37 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - final bloc = context.read(); - bloc.add( - const QuoteListRefreshed(), - ); - - final stateChangeFuture = bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), ), - ], - ), + ), + ], ), ), ), diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_state.dart index e8aa3e3b..b2a4a868 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_list_state.dart @@ -1,5 +1,24 @@ part of 'quote_list_bloc.dart'; +/// Holds all data needed to infer the state of the paginated grid of quotes. +/// +/// You don't have to memorize what combination of properties lead to which +/// visual outputs, the [infinite_scroll_pagination](https://github.com/EdsonBueno/infinite_scroll_pagination) +/// package takes care of that. Simply provide the values as you have them and +/// everything will work. +/// +/// For example: +/// 1. If both [itemList] and [error] aren't null, that is, if you have +/// both some quotes and an error at the same time, that means the error occurred +/// trying to fetch a *subsequent* page, therefore, the error indicator should +/// be appended to the bottom of the grid instead of taking the whole screen. +/// 2. If [error] isn't null but [itemList] is, that +/// means the error occurred trying to fetch the *first* page, in which case you +/// want to display the full-screen error indicator since you don't have any +/// quotes to show. +/// 3. If there's no [error], [itemList] has some items and [nextPage] isn't null, +/// that means you haven't fetched all pages yet and therefore a loading indicator +/// should be appended to the bottom of the grid. class QuoteListState extends Equatable { const QuoteListState({ this.itemList, @@ -8,80 +27,113 @@ class QuoteListState extends Equatable { this.filter, this.refreshError, this.favoriteToggleError, - DateTime? fetchTimestamp, - }) : _fetchTimestamp = fetchTimestamp; + }); + /// Holds all of the items from the pages you have loaded so far. final List? itemList; + + /// The next page to be fetched, or `null` if you have already loaded the entire list. + /// + /// Besides determining which page should be asked next, it also determines + /// whether you need a loading indicator at the bottom to indicate you haven't + /// fetched all pages yet. final int? nextPage; + + /// Indicates an error occurred trying to fetch any page of quotes. + /// + /// If both this property and [itemList] holds values, that means the error + /// occurred trying to fetch a subsequent page. If, on the other hand, this + /// property has a value but [itemList] doesn't, that means the error occurred + /// when fetching the first page. final dynamic error; + + /// The currently applied filter (if any). + /// + /// Can be either a tag filter (`QuoteListFilterByTag`), a search filter (`QuoteListFilterBySearchTerm`), + /// or a favorites-only one (`QuoteListFilterByFavorites`). final QuoteListFilter? filter; - final DateTime? _fetchTimestamp; + + /// Indicates an error occurred trying to refresh the list. + /// + /// Used to display a snackbar to indicate the failure. final dynamic refreshError; + + /// Indicates an error occurred trying to favorite a quote. + /// + /// Used to display a snackbar to the user indicating the failure and also + /// redirect them to the Sign In screen in case the cause of the error is the + /// user being signed out. final dynamic favoriteToggleError; - factory QuoteListState.loadingNewTag({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a tag change. + QuoteListState.loadingNewTag({ required Tag? tag, - }) { - return QuoteListState( - filter: tag != null ? QuoteListFilterByTag(tag) : null, - ); - } + }) : this( + filter: tag != null ? QuoteListFilterByTag(tag) : null, + ); - factory QuoteListState.loadingNewSearchTerm({ + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a search change. + QuoteListState.loadingNewSearchTerm({ required String searchTerm, - }) { - return QuoteListState( - filter: searchTerm.isEmpty - ? null - : QuoteListFilterBySearchTerm( - searchTerm, - ), - ); - } - - factory QuoteListState.loadingToggledFavoritesFilter({ + }) : this( + filter: searchTerm.isEmpty + ? null + : QuoteListFilterBySearchTerm( + searchTerm, + ), + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// is loading a change in the favorites-only toggle. + const QuoteListState.loadingToggledFavoritesFilter({ required bool isFilteringByFavorites, - }) { - return QuoteListState( - filter: - isFilteringByFavorites ? const QuoteListFilterByFavorites() : null, - ); - } - - factory QuoteListState.noItemsFound({ + }) : this( + filter: isFilteringByFavorites + ? const QuoteListFilterByFavorites() + : null, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// couldn't find any items for the selected filter. + const QuoteListState.noItemsFound({ required QuoteListFilter? filter, - }) { - return QuoteListState( - itemList: const [], - error: null, - nextPage: 1, - filter: filter, - ); - } - - factory QuoteListState.success({ + }) : this( + itemList: const [], + error: null, + nextPage: 1, + filter: filter, + ); + + /// Auxiliary constructor that facilitates building the state for when the app + /// has successfully loaded a new page. + const QuoteListState.success({ required int? nextPage, required List itemList, required QuoteListFilter? filter, required bool isRefresh, - }) { - return QuoteListState( - nextPage: nextPage, - itemList: itemList, - filter: filter, - fetchTimestamp: isRefresh ? DateTime.now() : null, - ); - } - - QuoteListState copyWithNewError(dynamic error) => QuoteListState( + }) : this( + nextPage: nextPage, + itemList: itemList, + filter: filter, + ); + + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [error] property. + QuoteListState copyWithNewError( + dynamic error, + ) => + QuoteListState( itemList: itemList, nextPage: nextPage, error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, ); + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [refreshError] property. QuoteListState copyWithNewRefreshError( dynamic refreshError, ) => @@ -91,10 +143,11 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); + /// Auxiliary function that creates a copy of the current state by replacing + /// just the [updatedQuote]. QuoteListState copyWithUpdatedQuote( Quote updatedQuote, ) { @@ -110,11 +163,12 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: null, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: null, ); } + /// Auxiliary function that creates a copy of the current state with a new + /// value for the [favoriteToggleError] property. QuoteListState copyWithFavoriteToggleError( dynamic favoriteToggleError, ) => @@ -124,7 +178,6 @@ class QuoteListState extends Equatable { error: error, filter: filter, refreshError: refreshError, - fetchTimestamp: _fetchTimestamp, favoriteToggleError: favoriteToggleError, ); @@ -134,7 +187,6 @@ class QuoteListState extends Equatable { nextPage, error, filter, - _fetchTimestamp, refreshError, favoriteToggleError, ]; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 83% rename from 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index 8bc9e2c3..5fe4581d 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,14 @@ class QuoteSliverGrid extends StatelessWidget { Widget build(BuildContext context) { final theme = WonderTheme.of(context); final onQuoteSelected = this.onQuoteSelected; - return SliverPadding( + final bloc = context.read(); + + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedStaggeredSliverGrid.count( + // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -38,7 +41,6 @@ class QuoteSliverGrid extends StatelessWidget { top: const OpeningQuoteSvgAsset(), bottom: const ClosingQuoteSvgAsset(), onFavorite: () { - final bloc = context.read(); bloc.add( isFavorite ? QuoteListItemUnfavorited(quote.id) @@ -48,9 +50,9 @@ class QuoteSliverGrid extends StatelessWidget { onTap: onQuoteSelected != null ? () async { final updatedQuote = await onQuoteSelected(quote.id); + if (updatedQuote != null && updatedQuote.isFavorite != quote.isFavorite) { - final bloc = context.read(); bloc.add( QuoteListItemUpdated( updatedQuote, @@ -64,9 +66,8 @@ class QuoteSliverGrid extends StatelessWidget { firstPageErrorIndicatorBuilder: (context) { return ExceptionIndicator( onTryAgain: () { - final bloc = context.read(); bloc.add( - const QuoteListFirstPageRequested(), + const QuoteListFailedFetchRetried(), ); }, ); @@ -75,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart new file mode 100644 index 00000000..be337863 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -0,0 +1,77 @@ +import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_list/src/quote_list_bloc.dart'; + +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ + required this.pagingController, + this.onQuoteSelected, + Key? key, + }) : super(key: key); + + final PagingController pagingController; + final QuoteSelected? onQuoteSelected; + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + final onQuoteSelected = this.onQuoteSelected; + final bloc = context.read(); + + return Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, + ), + child: PagedListView.separated( + pagingController: pagingController, + builderDelegate: PagedChildBuilderDelegate( + itemBuilder: (context, quote, index) { + final isFavorite = quote.isFavorite ?? false; + return QuoteCard( + statement: quote.body, + author: quote.author, + isFavorite: isFavorite, + top: const OpeningQuoteSvgAsset(), + bottom: const ClosingQuoteSvgAsset(), + onFavorite: () { + bloc.add( + isFavorite + ? QuoteListItemUnfavorited(quote.id) + : QuoteListItemFavorited(quote.id), + ); + }, + onTap: onQuoteSelected != null + ? () async { + final updatedQuote = await onQuoteSelected(quote.id); + + if (updatedQuote != null && + updatedQuote.isFavorite != quote.isFavorite) { + bloc.add( + QuoteListItemUpdated( + updatedQuote, + ), + ); + } + } + : null, + ); + }, + firstPageErrorIndicatorBuilder: (context) { + return ExceptionIndicator( + onTryAgain: () { + bloc.add( + const QuoteListFailedFetchRetried(), + ); + }, + ); + }, + ), + separatorBuilder: (context, index) => + SizedBox(height: theme.gridSpacing)), + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.lock deleted file mode 100644 index 655120cd..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.lock +++ /dev/null @@ -1,714 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: "direct main" - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - quote_repository: - dependency: "direct main" - description: - path: "../../quote_repository" - relative: true - source: path - version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.yaml index 3fa692f9..7eef55f0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/quote_list/pubspec.yaml @@ -8,7 +8,8 @@ dependencies: component_library: path: ../../component_library equatable: ^2.0.3 - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 + bloc_concurrency: ^0.2.0 flutter: sdk: flutter domain_models: @@ -17,11 +18,10 @@ dependencies: path: ../../quote_repository user_repository: path: ../../user_repository - infinite_scroll_pagination: - git: - url: git://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: feature/staggered-grid - rxdart: ^0.27.1 + monitoring: + path: ../../monitoring + infinite_scroll_pagination: ^4.0.0-dev.1 + rxdart: ^0.27.3 dev_dependencies: flutter_test: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config.json deleted file mode 100644 index 878881fc..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_in", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:25:57.665783Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config_subset deleted file mode 100644 index c1a0684d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -sign_in -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_in/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins-dependencies deleted file mode 100644 index cc604ca9..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:25:57.852301","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.packages deleted file mode 100644 index 2e6231e6..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:25:57.632637. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_in:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_cubit.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_cubit.dart index 5db3fc78..fe0f041a 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_cubit.dart @@ -1,3 +1,4 @@ +import 'package:domain_models/domain_models.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:form_fields/form_fields.dart'; @@ -15,76 +16,88 @@ class SignInCubit extends Cubit { final UserRepository userRepository; void onEmailChanged(String newValue) { - final previousValue = state.email; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - email: shouldValidate - ? Email.dirty( - newValue, - ) - : Email.pure( - newValue, - ), - error: null, + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final shouldValidate = previousEmailState.invalid; + final newEmailState = shouldValidate + ? Email.validated( + newValue, + ) + : Email.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + email: newEmailState, ); - emit(newState); + emit(newScreenState); } - void onPasswordChanged(String newValue) { - final previousValue = state.password; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, - ); + void onEmailUnfocused() { + final previousScreenState = state; + final previousEmailState = previousScreenState.email; + final previousEmailValue = previousEmailState.value; - emit(newState); + final newEmailState = Email.validated( + previousEmailValue, + ); + final newScreenState = previousScreenState.copyWith( + email: newEmailState, + ); + emit(newScreenState); } - void onEmailUnfocused() { - final newState = state.copyWith( - email: Email.dirty( - state.email.value, - ), - error: null, + void onPasswordChanged(String newValue) { + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final shouldValidate = previousPasswordState.invalid; + final newPasswordState = shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ); + + final newScreenState = state.copyWith( + password: newPasswordState, ); - emit(newState); + emit(newScreenState); } void onPasswordUnfocused() { - final newState = state.copyWith( - password: Password.dirty( - state.password.value, - ), - error: null, - ); + final previousScreenState = state; + final previousPasswordState = previousScreenState.password; + final previousPasswordValue = previousPasswordState.value; - emit(newState); + final newPasswordState = Password.validated( + previousPasswordValue, + ); + final newScreenState = previousScreenState.copyWith( + password: newPasswordState, + ); + emit(newScreenState); } void onSubmit() async { - final email = Email.dirty(state.email.value); - final password = Password.dirty(state.password.value); + final email = Email.validated(state.email.value); + final password = Password.validated(state.password.value); + final isFormValid = Formz.validate([ - email, - password, - ]) == - FormzStatus.valid; + email, + password, + ]).isValid; + final newState = state.copyWith( email: email, password: password, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signIn( @@ -92,14 +105,14 @@ class SignInCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error, - status: FormzStatus.submissionFailure, + submissionStatus: error is InvalidCredentialsException + ? SubmissionStatus.invalidCredentialsError + : SubmissionStatus.genericError, ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_screen.dart index 51ae1d7a..82ce0da0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_screen.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -38,7 +37,7 @@ class SignInScreen extends StatelessWidget { } @visibleForTesting -class SignInView extends StatefulWidget { +class SignInView extends StatelessWidget { const SignInView({ required this.onSignInSuccess, this.onSignUpTap, @@ -51,10 +50,53 @@ class SignInView extends StatefulWidget { final VoidCallback onSignInSuccess; @override - _SignInViewState createState() => _SignInViewState(); + Widget build(BuildContext context) { + final l10n = SignInLocalizations.of(context); + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + l10n.appBarTitle, + ), + ), + body: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric( + horizontal: Spacing.mediumLarge, + ), + child: _SignInForm( + onSignUpTap: onSignUpTap, + onForgotMyPasswordTap: onForgotMyPasswordTap, + onSignInSuccess: onSignInSuccess, + ), + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignInForm extends StatefulWidget { + const _SignInForm({ + required this.onSignInSuccess, + this.onSignUpTap, + this.onForgotMyPasswordTap, + Key? key, + }) : super(key: key); + + final VoidCallback? onSignUpTap; + final VoidCallback? onForgotMyPasswordTap; + final VoidCallback onSignInSuccess; + + @override + State<_SignInForm> createState() => _SignInFormState(); } -class _SignInViewState extends State { +class _SignInFormState extends State<_SignInForm> { final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -74,22 +116,34 @@ class _SignInViewState extends State { }); } + @override + void dispose() { + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { final l10n = SignInLocalizations.of(context); - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignInSuccess(); return; } - final error = state.error; - if (error != null) { + final hasSubmissionError = state.submissionStatus == + SubmissionStatus.genericError || + state.submissionStatus == SubmissionStatus.invalidCredentialsError; + + if (hasSubmissionError) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( - error is InvalidCredentialsException + state.submissionStatus == SubmissionStatus.invalidCredentialsError ? SnackBar( content: Text( l10n.invalidCredentialsErrorMessage, @@ -99,75 +153,21 @@ class _SignInViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - l10n.appBarTitle, - ), - ), - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.mediumLarge, - ), - child: _SignInForm( - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - onSignUpTap: widget.onSignUpTap, - onForgotMyPasswordTap: widget.onForgotMyPasswordTap, - ), - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); - - @override - void dispose() { - _emailFocusNode.dispose(); - _passwordFocusNode.dispose(); - super.dispose(); - } -} - -class _SignInForm extends StatelessWidget { - const _SignInForm({ - required this.emailFocusNode, - required this.passwordFocusNode, - this.onSignUpTap, - this.onForgotMyPasswordTap, - Key? key, - }) : super(key: key); - - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - - @override - Widget build(BuildContext context) { - final l10n = SignInLocalizations.of(context); - return BlocBuilder( builder: (context, state) { final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; final cubit = context.read(); return Column( children: [ TextField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -185,7 +185,7 @@ class _SignInForm extends StatelessWidget { height: Spacing.large, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, obscureText: true, onEditingComplete: cubit.onSubmit, @@ -206,7 +206,8 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.forgotMyPasswordButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onForgotMyPasswordTap, + onPressed: + isSubmissionInProgress ? null : widget.onForgotMyPasswordTap, ), const SizedBox( height: Spacing.small, @@ -232,7 +233,7 @@ class _SignInForm extends StatelessWidget { child: Text( l10n.signUpButtonLabel, ), - onPressed: isSubmissionInProgress ? null : onSignUpTap, + onPressed: isSubmissionInProgress ? null : widget.onSignUpTap, ), ], ); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_state.dart index 226fb0b8..05f6065f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/lib/src/sign_in_state.dart @@ -2,28 +2,24 @@ part of 'sign_in_cubit.dart'; class SignInState extends Equatable { const SignInState({ - this.email = const Email.pure(), - this.password = const Password.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.password = const Password.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); final Email email; final Password password; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignInState copyWith({ Email? email, Password? password, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignInState( email: email ?? this.email, password: password ?? this.password, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @@ -31,7 +27,23 @@ class SignInState extends Equatable { List get props => [ email, password, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + /// Used when the form has not been sent yet. + idle, + + /// Used to disable all buttons and add a progress indicator to the main one. + inProgress, + + /// Used to close the screen and navigate back to the caller screen. + success, + + /// Used to display a generic snack bar saying that an error has occurred, e.g., no internet connection. + genericError, + + /// Used to show a more specific error telling the user they got the email and/or password wrong. + invalidCredentialsError, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.yaml index 77b2b521..9f15389f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: component_library: path: ../../component_library - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 flutter: sdk: flutter user_repository: @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config.json deleted file mode 100644 index ace398b2..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sign_up", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:01.501790Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config_subset deleted file mode 100644 index 92fa1a33..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -sign_up -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/sign_up/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins-dependencies deleted file mode 100644 index a689392d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:01.710617","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.packages deleted file mode 100644 index e7732711..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:01.465330. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sign_up:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_cubit.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_cubit.dart index 767d87b0..1c5749c0 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_cubit.dart @@ -15,97 +15,75 @@ class SignUpCubit extends Cubit { final UserRepository userRepository; - void onUsernameChanged(String newValue) { - final previousUsername = state.username; - final shouldValidate = previousUsername.invalid; - final newState = state.copyWith( - username: shouldValidate - ? Username.dirty( - newValue, - isAlreadyRegistered: newValue == previousUsername.value - ? previousUsername.isAlreadyRegistered - : false, - ) - : Username.pure( - newValue, - ), - error: null, - ); - emit(newState); - } - void onEmailChanged(String newValue) { final previousEmail = state.email; final shouldValidate = previousEmail.invalid; final newState = state.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousEmail.value ? previousEmail.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } - void onPasswordChanged(String newValue) { - final previousPassword = state.password; - final shouldValidate = previousPassword.invalid; + void onEmailUnfocused() { final newState = state.copyWith( - password: shouldValidate - ? Password.dirty( - newValue, - ) - : Password.pure( - newValue, - ), - error: null, + email: Email.validated( + state.email.value, + isAlreadyRegistered: state.email.isAlreadyRegistered, + ), ); emit(newState); } - void onPasswordConfirmationChanged(String newValue) { - final previousPasswordConfirmation = state.passwordConfirmation; - final shouldValidate = previousPasswordConfirmation.invalid; + void onUsernameChanged(String newValue) { + final previousUsername = state.username; + final shouldValidate = previousUsername.invalid; final newState = state.copyWith( - passwordConfirmation: shouldValidate - ? PasswordConfirmation.dirty( + username: shouldValidate + ? Username.validated( newValue, - password: state.password, + isAlreadyRegistered: newValue == previousUsername.value + ? previousUsername.isAlreadyRegistered + : false, ) - : PasswordConfirmation.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); } void onUsernameUnfocused() { final newState = state.copyWith( - username: Username.dirty( + username: Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } - void onEmailUnfocused() { + void onPasswordChanged(String newValue) { + final previousPassword = state.password; + final shouldValidate = previousPassword.invalid; final newState = state.copyWith( - email: Email.dirty( - state.email.value, - isAlreadyRegistered: state.email.isAlreadyRegistered, - ), - error: null, + password: shouldValidate + ? Password.validated( + newValue, + ) + : Password.unvalidated( + newValue, + ), ); emit(newState); @@ -113,41 +91,59 @@ class SignUpCubit extends Cubit { void onPasswordUnfocused() { final newState = state.copyWith( - password: Password.dirty( + password: Password.validated( state.password.value, ), - error: null, + ); + emit(newState); + } + + void onPasswordConfirmationChanged(String newValue) { + final previousPasswordConfirmation = state.passwordConfirmation; + final shouldValidate = previousPasswordConfirmation.invalid; + final newState = state.copyWith( + passwordConfirmation: shouldValidate + ? PasswordConfirmation.validated( + newValue, + password: state.password, + ) + : PasswordConfirmation.unvalidated( + newValue, + ), ); emit(newState); } void onPasswordConfirmationUnfocused() { final newState = state.copyWith( - passwordConfirmation: PasswordConfirmation.dirty( + passwordConfirmation: PasswordConfirmation.validated( state.passwordConfirmation.value, password: state.password, ), - error: null, ); emit(newState); } void onSubmit() async { - final username = Username.dirty( + final username = Username.validated( state.username.value, isAlreadyRegistered: state.username.isAlreadyRegistered, ); - final email = Email.dirty( + + final email = Email.validated( state.email.value, isAlreadyRegistered: state.email.isAlreadyRegistered, ); - final password = Password.dirty( + + final password = Password.validated( state.password.value, ); - final passwordConfirmation = PasswordConfirmation.dirty( + + final passwordConfirmation = PasswordConfirmation.validated( state.passwordConfirmation.value, password: password, ); + final isFormValid = Formz.validate([ username, email, @@ -155,15 +151,17 @@ class SignUpCubit extends Cubit { passwordConfirmation, ]) == FormzStatus.valid; + final newState = state.copyWith( username: username, email: email, password: password, passwordConfirmation: passwordConfirmation, - status: isFormValid ? FormzStatus.submissionInProgress : state.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); + emit(newState); + if (isFormValid) { try { await userRepository.signUp( @@ -172,29 +170,27 @@ class SignUpCubit extends Cubit { password.value, ); final newState = state.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = state.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) - : null, + : state.username, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) - : null, + : state.email, ); emit(newState); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_screen.dart index ded26ec0..00cc6d8f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_screen.dart @@ -31,7 +31,7 @@ class SignUpScreen extends StatelessWidget { } @visibleForTesting -class SignUpView extends StatefulWidget { +class SignUpView extends StatelessWidget { const SignUpView({ required this.onSignUpSuccess, Key? key, @@ -40,10 +40,46 @@ class SignUpView extends StatefulWidget { final VoidCallback onSignUpSuccess; @override - _SignUpViewState createState() => _SignUpViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + SignUpLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _SignUpForm( + onSignUpSuccess: onSignUpSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _SignUpForm extends StatefulWidget { + const _SignUpForm({ + required this.onSignUpSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onSignUpSuccess; + + @override + State<_SignUpForm> createState() => _SignUpFormState(); } -class _SignUpViewState extends State { +class _SignUpFormState extends State<_SignUpForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -52,24 +88,40 @@ class _SignUpViewState extends State { @override void initState() { super.initState(); - _usernameFocusNode.addListener(() { - if (!_usernameFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onUsernameUnfocused(); - } - }); + _setUpEmailFieldFocusListener(); + _setUpUsernameFieldFocusListener(); + _setUpPasswordFieldFocusListener(); + _setUpPasswordConfirmationFieldFocusListener(); + } + + void _setUpEmailFieldFocusListener() { _emailFocusNode.addListener(() { if (!_emailFocusNode.hasFocus) { final cubit = context.read(); cubit.onEmailUnfocused(); } }); + } + + void _setUpUsernameFieldFocusListener() { + _usernameFocusNode.addListener(() { + if (!_usernameFocusNode.hasFocus) { + final cubit = context.read(); + cubit.onUsernameUnfocused(); + } + }); + } + + void _setUpPasswordFieldFocusListener() { _passwordFocusNode.addListener(() { if (!_passwordFocusNode.hasFocus) { final cubit = context.read(); cubit.onPasswordUnfocused(); } }); + } + + void _setUpPasswordConfirmationFieldFocusListener() { _passwordConfirmationFocusNode.addListener(() { if (!_passwordConfirmationFocusNode.hasFocus) { final cubit = context.read(); @@ -80,14 +132,16 @@ class _SignUpViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + oldState.submissionStatus != newState.submissionStatus, listener: (context, state) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onSignUpSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -95,114 +149,69 @@ class _SignUpViewState extends State { ); } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - SignUpLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _SignUpForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _SignUpForm extends StatelessWidget { - const _SignUpForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = SignUpLocalizations.of(context); final cubit = context.read(); + final emailError = state.email.invalid ? state.email.error : null; final usernameError = state.username.invalid ? state.username.error : null; - final emailError = state.email.invalid ? state.email.error : null; final passwordError = state.password.invalid ? state.password.error : null; final passwordConfirmationError = state.passwordConfirmation.invalid ? state.passwordConfirmation.error : null; final isSubmissionInProgress = - state.status == FormzStatus.submissionInProgress; + state.submissionStatus == SubmissionStatus.inProgress; return Column( children: [ TextField( - focusNode: usernameFocusNode, - onChanged: cubit.onUsernameChanged, + focusNode: _emailFocusNode, + onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.person, + Icons.alternate_email, ), enabled: !isSubmissionInProgress, - labelText: l10n.usernameTextFieldLabel, - errorText: usernameError == null + labelText: l10n.emailTextFieldLabel, + errorText: emailError == null ? null - : (usernameError == UsernameValidationError.empty - ? l10n.usernameTextFieldEmptyErrorMessage - : (usernameError == UsernameValidationError.alreadyTaken - ? l10n.usernameTextFieldAlreadyTakenErrorMessage - : l10n.usernameTextFieldInvalidErrorMessage)), + : (emailError == EmailValidationError.empty + ? l10n.emailTextFieldEmptyErrorMessage + : (emailError == EmailValidationError.alreadyRegistered + ? l10n.emailTextFieldAlreadyRegisteredErrorMessage + : l10n.emailTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: emailFocusNode, - onChanged: cubit.onEmailChanged, + focusNode: _usernameFocusNode, + onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( - Icons.alternate_email, + Icons.person, ), enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null + labelText: l10n.usernameTextFieldLabel, + errorText: usernameError == null ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : (emailError == EmailValidationError.alreadyRegistered - ? l10n.emailTextFieldAlreadyRegisteredErrorMessage - : l10n.emailTextFieldInvalidErrorMessage)), + : (usernameError == UsernameValidationError.empty + ? l10n.usernameTextFieldEmptyErrorMessage + : (usernameError == UsernameValidationError.alreadyTaken + ? l10n.usernameTextFieldAlreadyTakenErrorMessage + : l10n.usernameTextFieldInvalidErrorMessage)), ), ), const SizedBox( height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -223,7 +232,7 @@ class _SignUpForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -261,4 +270,13 @@ class _SignUpForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _emailFocusNode.dispose(); + _usernameFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_state.dart index e88ae868..4da10fc1 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/lib/src/sign_up_state.dart @@ -2,46 +2,48 @@ part of 'sign_up_cubit.dart'; class SignUpState extends Equatable { const SignUpState({ - this.username = const Username.pure(), - this.email = const Email.pure(), - this.password = const Password.pure(), - this.passwordConfirmation = const PasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + this.email = const Email.unvalidated(), + this.username = const Username.unvalidated(), + this.password = const Password.unvalidated(), + this.passwordConfirmation = const PasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final Password password; final PasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; SignUpState copyWith({ - Username? username, Email? email, + Username? username, Password? password, PasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return SignUpState( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.yaml index 34e25d43..bf170f01 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/sign_up/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config.json deleted file mode 100644 index 410aaca8..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "archive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "auto_size_text", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "clock", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "component_library", - "rootUri": "../../../component_library", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fake_async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_bloc", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_localizations", - "rootUri": "file:///Users/vid/flutter/packages/flutter_localizations", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_svg", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_test", - "rootUri": "file:///Users/vid/flutter/packages/flutter_test", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../../../form_fields", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "intl", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lottie", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "nested", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_drawing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_parsing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "petitparser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../../../user_repository", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "xml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "update_profile", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:05.525418Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config_subset deleted file mode 100644 index 85d61e3d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/package_config_subset +++ /dev/null @@ -1,405 +0,0 @@ -component_library -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/component_library/lib/ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -update_profile -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/features/update_profile/lib/ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_bloc -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_localizations -2.12 -file:///Users/vid/flutter/packages/flutter_localizations/ -file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_test -2.12 -file:///Users/vid/flutter/packages/flutter_test/ -file:///Users/vid/flutter/packages/flutter_test/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins-dependencies deleted file mode 100644 index e02a1edf..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:05.710740","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.packages deleted file mode 100644 index 1ed9c22a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/.packages +++ /dev/null @@ -1,107 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:05.483183. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-31.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.8.0/lib/ -archive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -auto_size_text:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/auto_size_text-3.0.0-nullsafety.0/lib/ -bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/bloc-8.0.0-dev.3/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -clock:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -component_library:../../component_library/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fake_async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/ -fav_qs_api:../../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_bloc:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_bloc-8.0.0-dev.2/lib/ -flutter_lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_lints-1.0.4/lib/ -flutter_localizations:file:///Users/vid/flutter/packages/flutter_localizations/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -flutter_svg:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.22.0/lib/ -flutter_test:file:///Users/vid/flutter/packages/flutter_test/lib/ -form_fields:../../form_fields/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.1.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -intl:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -lottie:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lottie-1.1.0/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -nested:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/nested-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_drawing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_drawing-0.5.1/lib/ -path_parsing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_parsing-0.2.1/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -petitparser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-4.1.0/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/provider-6.0.1/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rive-0.7.28/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.19.5/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.8/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.9/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -user_repository:../../user_repository/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -xml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xml-5.1.2/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -update_profile:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_en.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_en.arb index 6144c43b..c66d0109 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_en.arb +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_en.arb @@ -9,8 +9,8 @@ "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", "emailTextFieldInvalidErrorMessage": "This email is not valid.", "emailTextFieldAlreadyRegisteredErrorMessage": "This email is already registered.", - "passwordTextFieldLabel": "Password", + "passwordTextFieldLabel": "New Password", "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "passwordConfirmationTextFieldLabel": "Password Confirmation", + "passwordConfirmationTextFieldLabel": "New Password Confirmation", "passwordConfirmationTextFieldInvalidErrorMessage": "Your passwords don't match." } \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_cubit.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_cubit.dart index cdd5d084..3fedabee 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_cubit.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_cubit.dart @@ -23,16 +23,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( username: shouldValidate - ? Username.dirty( + ? Username.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Username.pure( + : Username.unvalidated( newValue, ), - error: null, ); emit(newState); @@ -44,16 +43,15 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( email: shouldValidate - ? Email.dirty( + ? Email.validated( newValue, isAlreadyRegistered: newValue == previousValue.value ? previousValue.isAlreadyRegistered : false, ) - : Email.pure( + : Email.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -64,13 +62,12 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid && newValue.isNotEmpty; final newState = currentState.copyWith( password: shouldValidate - ? OptionalPassword.dirty( + ? OptionalPassword.validated( newValue, ) - : OptionalPassword.pure( + : OptionalPassword.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -81,14 +78,13 @@ class UpdateProfileCubit extends Cubit { final shouldValidate = previousValue.invalid; final newState = currentState.copyWith( passwordConfirmation: shouldValidate - ? OptionalPasswordConfirmation.dirty( + ? OptionalPasswordConfirmation.validated( newValue, password: currentState.password, ) - : OptionalPasswordConfirmation.pure( + : OptionalPasswordConfirmation.unvalidated( newValue, ), - error: null, ); emit(newState); } @@ -96,11 +92,10 @@ class UpdateProfileCubit extends Cubit { void onUsernameUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - username: Username.dirty( + username: Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -108,11 +103,10 @@ class UpdateProfileCubit extends Cubit { void onEmailUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - email: Email.dirty( + email: Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ), - error: null, ); emit(newState); } @@ -120,41 +114,39 @@ class UpdateProfileCubit extends Cubit { void onPasswordUnfocused() { final currentState = state as UpdateProfileLoaded; final newState = currentState.copyWith( - password: OptionalPassword.dirty( + password: OptionalPassword.validated( currentState.password.value, ), - error: null, ); emit(newState); } void onPasswordConfirmationUnfocused() { final currentState = state as UpdateProfileLoaded; - final confirmation = OptionalPasswordConfirmation.dirty( + final confirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: currentState.password, ); final newState = currentState.copyWith( passwordConfirmation: confirmation, - error: null, ); emit(newState); } void onSubmit() async { final currentState = state as UpdateProfileLoaded; - final username = Username.dirty( + final username = Username.validated( currentState.username.value, isAlreadyRegistered: currentState.username.isAlreadyRegistered, ); - final email = Email.dirty( + final email = Email.validated( currentState.email.value, isAlreadyRegistered: currentState.email.isAlreadyRegistered, ); - final password = OptionalPassword.dirty( + final password = OptionalPassword.validated( currentState.password.value, ); - final passwordConfirmation = OptionalPasswordConfirmation.dirty( + final passwordConfirmation = OptionalPasswordConfirmation.validated( currentState.passwordConfirmation.value, password: password, ); @@ -170,9 +162,7 @@ class UpdateProfileCubit extends Cubit { email: email, password: password, passwordConfirmation: passwordConfirmation, - status: - isFormValid ? FormzStatus.submissionInProgress : currentState.status, - error: null, + submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, ); emit(newState); @@ -184,25 +174,23 @@ class UpdateProfileCubit extends Cubit { password.value, ); final newState = currentState.copyWith( - status: FormzStatus.submissionSuccess, - error: null, + submissionStatus: SubmissionStatus.success, ); emit(newState); } catch (error) { final newState = currentState.copyWith( - error: error is! UsernameAlreadyTakenException && + submissionStatus: error is! UsernameAlreadyTakenException && error is! EmailAlreadyRegisteredException - ? error - : null, - status: FormzStatus.submissionFailure, + ? SubmissionStatus.error + : SubmissionStatus.idle, username: error is UsernameAlreadyTakenException - ? Username.dirty( + ? Username.validated( username.value, isAlreadyRegistered: true, ) : null, email: error is EmailAlreadyRegisteredException - ? Email.dirty( + ? Email.validated( email.value, isAlreadyRegistered: true, ) @@ -217,8 +205,8 @@ class UpdateProfileCubit extends Cubit { final user = await userRepository.getUser().first; if (user != null) { final newState = UpdateProfileLoaded( - username: Username.pure(user.username), - email: Email.pure(user.email), + username: Username.unvalidated(user.username), + email: Email.unvalidated(user.email), ); emit(newState); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_screen.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_screen.dart index fa9a9943..93693318 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_screen.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_screen.dart @@ -31,7 +31,7 @@ class UpdateProfileScreen extends StatelessWidget { } @visibleForTesting -class UpdateProfileView extends StatefulWidget { +class UpdateProfileView extends StatelessWidget { const UpdateProfileView({ required this.onUpdateProfileSuccess, Key? key, @@ -40,10 +40,46 @@ class UpdateProfileView extends StatefulWidget { final VoidCallback onUpdateProfileSuccess; @override - _UpdateProfileViewState createState() => _UpdateProfileViewState(); + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _releaseFocus(context), + child: Scaffold( + appBar: AppBar( + systemOverlayStyle: SystemUiOverlayStyle.light, + title: Text( + UpdateProfileLocalizations.of(context).appBarTitle, + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.only( + left: Spacing.mediumLarge, + right: Spacing.mediumLarge, + top: Spacing.mediumLarge, + ), + child: _UpdateProfileForm( + onUpdateProfileSuccess: onUpdateProfileSuccess, + ), + ), + ), + ); + } + + void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); +} + +class _UpdateProfileForm extends StatefulWidget { + const _UpdateProfileForm({ + required this.onUpdateProfileSuccess, + Key? key, + }) : super(key: key); + + final VoidCallback onUpdateProfileSuccess; + + @override + State<_UpdateProfileForm> createState() => _UpdateProfileFormState(); } -class _UpdateProfileViewState extends State { +class _UpdateProfileFormState extends State<_UpdateProfileForm> { final _usernameFocusNode = FocusNode(); final _emailFocusNode = FocusNode(); final _passwordFocusNode = FocusNode(); @@ -80,15 +116,20 @@ class _UpdateProfileViewState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocConsumer( + listenWhen: (oldState, newState) => + (oldState is UpdateProfileLoaded + ? oldState.submissionStatus + : null) != + (newState is UpdateProfileLoaded ? newState.submissionStatus : null), listener: (context, state) { if (state is UpdateProfileLoaded) { - if (state.status == FormzStatus.submissionSuccess) { + if (state.submissionStatus == SubmissionStatus.success) { widget.onUpdateProfileSuccess(); return; } - if (state.error != null) { + if (state.submissionStatus == SubmissionStatus.error) { ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar( @@ -97,53 +138,6 @@ class _UpdateProfileViewState extends State { } } }, - child: GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - UpdateProfileLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _UpdateProfileForm( - usernameFocusNode: _usernameFocusNode, - emailFocusNode: _emailFocusNode, - passwordFocusNode: _passwordFocusNode, - passwordConfirmationFocusNode: _passwordConfirmationFocusNode, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _UpdateProfileForm extends StatelessWidget { - const _UpdateProfileForm({ - required this.usernameFocusNode, - required this.emailFocusNode, - required this.passwordFocusNode, - required this.passwordConfirmationFocusNode, - Key? key, - }) : super(key: key); - - final FocusNode usernameFocusNode; - final FocusNode emailFocusNode; - final FocusNode passwordFocusNode; - final FocusNode passwordConfirmationFocusNode; - - @override - Widget build(BuildContext context) { - return BlocBuilder( builder: (context, state) { final l10n = UpdateProfileLocalizations.of(context); if (state is UpdateProfileLoaded) { @@ -159,10 +153,11 @@ class _UpdateProfileForm extends StatelessWidget { return Column( children: [ TextFormField( - focusNode: usernameFocusNode, + focusNode: _usernameFocusNode, initialValue: state.username.value, onChanged: cubit.onUsernameChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.person, @@ -183,10 +178,11 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextFormField( - focusNode: emailFocusNode, + focusNode: _emailFocusNode, initialValue: state.email.value, onChanged: cubit.onEmailChanged, textInputAction: TextInputAction.next, + autocorrect: false, decoration: InputDecoration( suffixIcon: const Icon( Icons.alternate_email, @@ -207,7 +203,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordFocusNode, + focusNode: _passwordFocusNode, onChanged: cubit.onPasswordChanged, textInputAction: TextInputAction.next, obscureText: true, @@ -226,7 +222,7 @@ class _UpdateProfileForm extends StatelessWidget { height: Spacing.mediumLarge, ), TextField( - focusNode: passwordConfirmationFocusNode, + focusNode: _passwordConfirmationFocusNode, onChanged: cubit.onPasswordConfirmationChanged, onEditingComplete: cubit.onSubmit, obscureText: true, @@ -263,4 +259,13 @@ class _UpdateProfileForm extends StatelessWidget { }, ); } + + @override + void dispose() { + _usernameFocusNode.dispose(); + _emailFocusNode.dispose(); + _passwordFocusNode.dispose(); + _passwordConfirmationFocusNode.dispose(); + super.dispose(); + } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_state.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_state.dart index a07c21b5..c6748888 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_state.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/lib/src/update_profile_state.dart @@ -13,48 +13,52 @@ class UpdateProfileInProgress extends UpdateProfileState { class UpdateProfileLoaded extends UpdateProfileState { const UpdateProfileLoaded({ - required this.username, required this.email, - this.password = const OptionalPassword.pure(), - this.passwordConfirmation = const OptionalPasswordConfirmation.pure(), - this.error, - this.status = FormzStatus.pure, + required this.username, + this.password = const OptionalPassword.unvalidated(), + this.passwordConfirmation = + const OptionalPasswordConfirmation.unvalidated(), + this.submissionStatus = SubmissionStatus.idle, }); - final Username username; final Email email; + final Username username; final OptionalPassword password; final OptionalPasswordConfirmation passwordConfirmation; - final dynamic error; - final FormzStatus status; + final SubmissionStatus submissionStatus; - bool get isSubmissionInProgress => status == FormzStatus.submissionInProgress; + bool get isSubmissionInProgress => + submissionStatus == SubmissionStatus.inProgress; UpdateProfileLoaded copyWith({ - Username? username, Email? email, + Username? username, OptionalPassword? password, OptionalPasswordConfirmation? passwordConfirmation, - FormzStatus? status, - required dynamic error, + SubmissionStatus? submissionStatus, }) { return UpdateProfileLoaded( - username: username ?? this.username, email: email ?? this.email, + username: username ?? this.username, password: password ?? this.password, passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - status: status ?? this.status, - error: error, + submissionStatus: submissionStatus ?? this.submissionStatus, ); } @override List get props => [ - username, email, + username, password, passwordConfirmation, - error, - status, + submissionStatus, ]; } + +enum SubmissionStatus { + idle, + inProgress, + success, + error, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.lock deleted file mode 100644 index 0f2376ba..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.lock +++ /dev/null @@ -1,698 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "31.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.0" - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0-nullsafety.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.3" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "../../component_library" - relative: true - source: path - version: "0.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: transitive - description: - path: "../../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.0-dev.2" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - form_fields: - dependency: "direct main" - description: - path: "../../form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: transitive - description: - path: "../../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.19.5" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - user_repository: - dependency: "direct main" - description: - path: "../../user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "6.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.yaml index abb39d30..11b78caf 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/features/update_profile/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library flutter: sdk: flutter - flutter_bloc: ^8.0.0-dev.2 + flutter_bloc: ^8.0.1 user_repository: path: ../../user_repository form_fields: @@ -25,4 +25,5 @@ dev_dependencies: flutter_lints: ^1.0.4 flutter: + generate: true uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config.json deleted file mode 100644 index 2dbfbceb..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "formz", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "form_fields", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:32.016162Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config_subset deleted file mode 100644 index d0eeb618..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/package_config_subset +++ /dev/null @@ -1,205 +0,0 @@ -form_fields -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/form_fields/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.packages deleted file mode 100644 index b96d0db6..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/.packages +++ /dev/null @@ -1,57 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:32.000436. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-24.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.1.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -formz:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/formz-0.4.0/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -form_fields:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/form_fields.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/form_fields.dart index d8fcf757..ba899732 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/form_fields.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/form_fields.dart @@ -1,4 +1,5 @@ -export 'package:formz/formz.dart'; +export 'package:formz/formz.dart' + show FormzInput, FormzStatus, Formz, FormzStatusX; export 'src/email.dart'; export 'src/optional_password.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/email.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/email.dart index e0175644..a5933abb 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/email.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/email.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum EmailValidationError { - empty, - invalid, - alreadyRegistered, -} - -class Email extends FormzInput { - const Email.pure([String value = '']) - : isAlreadyRegistered = false, +class Email extends FormzInput + with EquatableMixin { + const Email.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Email.dirty( + const Email.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -22,6 +19,7 @@ class Email extends FormzInput { '([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])' ')|([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})\$', ); + final bool isAlreadyRegistered; @override @@ -36,15 +34,15 @@ class Email extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Email && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum EmailValidationError { + empty, + invalid, + alreadyRegistered, } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password.dart index 9bf657d0..0f230b6e 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password.dart @@ -1,14 +1,18 @@ import 'package:formz/formz.dart'; -enum OptionalPasswordValidationError { - invalid, -} - +/// Represents an optional password field. +/// +/// Useful when the password can or can't be changed, such as in the update +/// profile screen. class OptionalPassword extends FormzInput { - const OptionalPassword.pure([String value = '']) : super.pure(value); + const OptionalPassword.unvalidated([ + String value = '', + ]) : super.pure(value); - const OptionalPassword.dirty([String value = '']) : super.dirty(value); + const OptionalPassword.validated([ + String value = '', + ]) : super.dirty(value); @override OptionalPasswordValidationError? validator(String value) { @@ -19,3 +23,7 @@ class OptionalPassword : OptionalPasswordValidationError.invalid); } } + +enum OptionalPasswordValidationError { + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password_confirmation.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password_confirmation.dart index 5d06ea5c..70365b8c 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/optional_password_confirmation.dart @@ -1,17 +1,19 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum OptionalPasswordConfirmationValidationError { - empty, - invalid, -} - +/// Represents an optional password confirmation field. +/// +/// Used in conjunction with [OptionalPassword] when the password can or can't +/// be changed, such as in the update profile screen. class OptionalPasswordConfirmation - extends FormzInput { - const OptionalPasswordConfirmation.pure([String value = '']) - : password = const OptionalPassword.pure(), + extends FormzInput + with EquatableMixin { + const OptionalPasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const OptionalPassword.unvalidated(), super.pure(value); - const OptionalPasswordConfirmation.dirty( + const OptionalPasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -30,14 +32,14 @@ class OptionalPasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is OptionalPasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum OptionalPasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password.dart index c92b98ec..9ac850ca 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password.dart @@ -1,21 +1,27 @@ import 'package:formz/formz.dart'; -enum PasswordValidationError { - empty, - invalid, -} - class Password extends FormzInput { - const Password.pure([String value = '']) : super.pure(value); + const Password.unvalidated([ + String value = '', + ]) : super.pure(value); - const Password.dirty([String value = '']) : super.dirty(value); + const Password.validated([ + String value = '', + ]) : super.dirty(value); @override PasswordValidationError? validator(String value) { - return value.isEmpty - ? PasswordValidationError.empty - : (value.length >= 5 && value.length <= 120 - ? null - : PasswordValidationError.invalid); + if (value.isEmpty) { + return PasswordValidationError.empty; + } else if (value.length < 5 || value.length > 120) { + return PasswordValidationError.invalid; + } else { + return null; + } } } + +enum PasswordValidationError { + empty, + invalid, +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password_confirmation.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password_confirmation.dart index 3295c24b..abb485ec 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password_confirmation.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/password_confirmation.dart @@ -1,17 +1,15 @@ +import 'package:equatable/equatable.dart'; import 'package:form_fields/form_fields.dart'; -enum PasswordConfirmationValidationError { - empty, - invalid, -} - class PasswordConfirmation - extends FormzInput { - const PasswordConfirmation.pure([String value = '']) - : password = const Password.pure(), + extends FormzInput + with EquatableMixin { + const PasswordConfirmation.unvalidated([ + String value = '', + ]) : password = const Password.unvalidated(), super.pure(value); - const PasswordConfirmation.dirty( + const PasswordConfirmation.validated( String value, { required this.password, }) : super.dirty(value); @@ -28,14 +26,14 @@ class PasswordConfirmation } @override - int get hashCode => value.hashCode ^ pure.hashCode ^ password.hashCode; + List get props => [ + value, + pure, + password, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is PasswordConfirmation && - other.value == value && - other.pure == pure && - other.password == password; - } +enum PasswordConfirmationValidationError { + empty, + invalid, } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/username.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/username.dart index 652b8441..453ec1b8 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/username.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/lib/src/username.dart @@ -1,17 +1,14 @@ +import 'package:equatable/equatable.dart'; import 'package:formz/formz.dart'; -enum UsernameValidationError { - empty, - invalid, - alreadyTaken, -} - -class Username extends FormzInput { - const Username.pure([String value = '']) - : isAlreadyRegistered = false, +class Username extends FormzInput + with EquatableMixin { + const Username.unvalidated([ + String value = '', + ]) : isAlreadyRegistered = false, super.pure(value); - const Username.dirty( + const Username.validated( String value, { this.isAlreadyRegistered = false, }) : super.dirty(value); @@ -34,15 +31,15 @@ class Username extends FormzInput { } @override - int get hashCode => - value.hashCode ^ pure.hashCode ^ isAlreadyRegistered.hashCode; + List get props => [ + value, + pure, + isAlreadyRegistered, + ]; +} - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) return false; - return other is Username && - other.value == value && - other.pure == pure && - other.isAlreadyRegistered == isAlreadyRegistered; - } +enum UsernameValidationError { + empty, + invalid, + alreadyTaken, } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.lock deleted file mode 100644 index a4332784..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.lock +++ /dev/null @@ -1,355 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "24.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - formz: - dependency: "direct main" - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.13.0 <3.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.yaml index 33b7a0ea..feed53bc 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/form_fields/pubspec.yaml @@ -5,7 +5,8 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - formz: ^0.4.0 + formz: ^0.4.1 + equatable: ^2.0.3 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config.json deleted file mode 100644 index 277b3d4c..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config.json +++ /dev/null @@ -1,530 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_daemon", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_resolvers", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "build_runner_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "built_value", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "checked_yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "code_builder", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dart_style", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fixnum", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "graphs", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive_generator", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pubspec_parse", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_gen", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_helper", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_transform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "timing", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:37.801472Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config_subset deleted file mode 100644 index ff03722a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/package_config_subset +++ /dev/null @@ -1,349 +0,0 @@ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_gen -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins-dependencies deleted file mode 100644 index c99bc08c..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:37.996598","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.packages deleted file mode 100644 index d30f69b8..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/.packages +++ /dev/null @@ -1,93 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:37.779715. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-22.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-1.7.2/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -build:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build-2.1.0/lib/ -build_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_config-1.0.0/lib/ -build_daemon:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_daemon-3.0.0/lib/ -build_resolvers:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_resolvers-2.0.4/lib/ -build_runner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner-2.1.1/lib/ -build_runner_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/build_runner_core-7.1.0/lib/ -built_collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_collection-5.1.0/lib/ -built_value:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/built_value-8.1.2/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -checked_yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/checked_yaml-2.0.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -code_builder:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/code_builder-4.1.0/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dart_style:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dart_style-2.0.3/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -fixnum:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/fixnum-1.0.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -graphs:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/graphs-2.0.0/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -hive_generator:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive_generator-1.1.0/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -pubspec_parse:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pubspec_parse-1.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_gen:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_gen-1.0.3/lib/ -source_helper:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_helper-1.2.1/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -stream_transform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_transform-2.0.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -timing:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/timing-1.0.0/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -key_value_storage:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/key_value_storage.dart index 17ba9292..d1006080 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/key_value_storage.dart @@ -1,3 +1,3 @@ export 'package:hive/hive.dart'; export 'src/key_value_storage.dart'; -export 'src/models/models.dart'; \ No newline at end of file +export 'src/models/models.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/key_value_storage.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/key_value_storage.dart index fc5c43fa..e527f2cd 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/key_value_storage.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/key_value_storage.dart @@ -1,8 +1,4 @@ -import 'package:hive/hive.dart'; import 'package:key_value_storage/key_value_storage.dart'; -import 'package:key_value_storage/src/models/dark_mode_preference_cm.dart'; -import 'package:key_value_storage/src/models/models.dart'; -import 'package:key_value_storage/src/models/user_cm.dart'; import 'package:meta/meta.dart'; import 'package:path_provider/path_provider.dart'; @@ -23,7 +19,6 @@ class KeyValueStorage { static const _quoteListPagesBoxKey = 'quote-list-pages'; static const _favoriteQuoteListPagesBoxKey = 'favorite-quote-list-pages'; static const _darkModePreferenceBoxKey = 'dark-mode-preference'; - static const _userBoxKey = 'user'; KeyValueStorage({ @visibleForTesting HiveInterface? hive, @@ -32,10 +27,7 @@ class KeyValueStorage { _hive ..registerAdapter(QuoteListPageCMAdapter()) ..registerAdapter(QuoteCMAdapter()) - ..registerAdapter(DarkModePreferenceCMAdapter()) - ..registerAdapter( - UserCMAdapter(), - ); + ..registerAdapter(DarkModePreferenceCMAdapter()); } catch (_) { throw Exception( 'You shouldn\'t have more than one [KeyValueStorage] instance in your ' @@ -57,11 +49,6 @@ class KeyValueStorage { isTemporary: true, ); - Future> get userBox => _openHiveBox( - _userBoxKey, - isTemporary: false, - ); - Future> get darkModePreferenceBox => _openHiveBox( _darkModePreferenceBoxKey, diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/models.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/models.dart index a8daf157..28f9e853 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/models.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/models.dart @@ -1,4 +1,3 @@ +export 'dark_mode_preference_cm.dart'; export 'quote_cm.dart'; export 'quote_list_page_cm.dart'; -export 'dark_mode_preference_cm.dart'; -export 'user_cm.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.dart deleted file mode 100644 index bbd7ab8c..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:hive/hive.dart'; - -part 'user_cm.g.dart'; - -@HiveType(typeId: 2) -class UserCM { - UserCM({ - required this.username, - required this.email, - }); - - @HiveField(0) - final String username; - @HiveField(1) - final String email; -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.g.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.g.dart deleted file mode 100644 index 47959a1e..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/lib/src/models/user_cm.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class UserCMAdapter extends TypeAdapter { - @override - final int typeId = 2; - - @override - UserCM read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return UserCM( - username: fields[0] as String, - email: fields[1] as String, - ); - } - - @override - void write(BinaryWriter writer, UserCM obj) { - writer - ..writeByte(2) - ..writeByte(0) - ..write(obj.username) - ..writeByte(1) - ..write(obj.email); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is UserCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/pubspec.lock deleted file mode 100644 index de687d15..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/pubspec.lock +++ /dev/null @@ -1,604 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "22.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.1.0" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.0" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.1.2" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - fixnum: - dependency: transitive - description: - name: fixnum - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - hive: - dependency: "direct main" - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - hive_generator: - dependency: "direct dev" - description: - name: hive_generator - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: "direct main" - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - pubspec_parse: - dependency: transitive - description: - name: pubspec_parse - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: - dependency: transitive - description: - name: source_gen - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - source_helper: - dependency: transitive - description: - name: source_helper - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/test/common_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/test/common_test.dart index 94779576..ccc2cf56 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/test/common_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/key_value_storage/test/common_test.dart @@ -8,7 +8,7 @@ import 'package:test/test.dart'; void main() { - test('Forgot my password', (){ + test('Forgot my password', () { // Build our app and trigger a frame. expect(1, 1); }); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config.json deleted file mode 100644 index f74adeae..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_analytics_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "firebase_core_web", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_web_plugins", - "rootUri": "file:///Users/vid/flutter/packages/flutter_web_plugins", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logger", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "monitoring", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:43.824072Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config_subset deleted file mode 100644 index 9e69d3bd..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/package_config_subset +++ /dev/null @@ -1,265 +0,0 @@ -monitoring -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins -2.12 -file:///Users/vid/flutter/packages/flutter_web_plugins/ -file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins deleted file mode 100644 index 4d750fc3..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -firebase_analytics=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/ -firebase_analytics_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/ -firebase_core=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/ -firebase_core_web=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins-dependencies deleted file mode 100644 index 92e7d987..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"android":[{"name":"firebase_analytics","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/","dependencies":[]}],"linux":[],"windows":[],"web":[{"name":"firebase_analytics_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_analytics","dependencies":["firebase_analytics_web","firebase_core"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]}],"date_created":"2022-04-19 02:26:44.006732","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.packages deleted file mode 100644 index bdd96a73..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/.packages +++ /dev/null @@ -1,72 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:43.809316. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -firebase:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-9.0.1/lib/ -firebase_analytics:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.3.0/lib/ -firebase_analytics_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_platform_interface-2.0.1/lib/ -firebase_analytics_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.3.0+1/lib/ -firebase_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.8.0/lib/ -firebase_core_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-4.0.1/lib/ -firebase_core_web:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-1.1.0/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_web_plugins:file:///Users/vid/flutter/packages/flutter_web_plugins/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.2/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -http:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logger:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -monitoring:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart index 021cc9a5..d2d3fba8 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart @@ -1 +1,8 @@ -export 'src/logger.dart'; +import 'package:firebase_core/firebase_core.dart'; + +export 'src/dynamic_link_service.dart'; +export 'src/analytics_service.dart'; +export 'src/error_reporting_service.dart'; +export 'src/remote_value_service.dart'; + +Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/analytics_service.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/analytics_service.dart new file mode 100644 index 00000000..d6db4664 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/analytics_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseAnalytics]. +class AnalyticsService { + AnalyticsService({ + @visibleForTesting FirebaseAnalytics? analytics, + }) : _analytics = analytics ?? FirebaseAnalytics.instance; + + final FirebaseAnalytics _analytics; + + Future setCurrentScreen(String screenName) { + return _analytics.setCurrentScreen( + screenName: screenName, + ); + } + + Future logEvent({ + required String name, + Map? parameters, + }) { + return _analytics.logEvent( + name: name, + parameters: parameters, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart new file mode 100644 index 00000000..c2b15a41 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart @@ -0,0 +1,60 @@ +import 'dart:async'; + +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:flutter/foundation.dart'; + +export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' + show SocialMetaTagParameters; + +typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); + +/// Wrapper around [FirebaseDynamicLinks]. +class DynamicLinkService { + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; + + DynamicLinkService({ + @visibleForTesting FirebaseDynamicLinks? dynamicLinks, + }) : _dynamicLinks = dynamicLinks ?? FirebaseDynamicLinks.instance; + + final FirebaseDynamicLinks _dynamicLinks; + + Future generateDynamicLinkUrl({ + required String path, + SocialMetaTagParameters? socialMetaTagParameters, + }) async { + final parameters = DynamicLinkParameters( + uriPrefix: _domainUriPrefix, + link: Uri.parse( + '$_domainUriPrefix$path', + ), + androidParameters: const AndroidParameters( + packageName: _androidPackageName, + ), + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, + ), + socialMetaTagParameters: socialMetaTagParameters, + ); + + final shortLink = await _dynamicLinks.buildShortLink(parameters); + return shortLink.shortUrl.toString(); + } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/error_reporting_service.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/error_reporting_service.dart new file mode 100644 index 00000000..e841435a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/error_reporting_service.dart @@ -0,0 +1,27 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseCrashlytics]. +class ErrorReportingService { + ErrorReportingService({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + final FirebaseCrashlytics _crashlytics; + + Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) { + return _crashlytics.recordFlutterError(flutterErrorDetails); + } + + Future recordError( + dynamic exception, + StackTrace? stack, { + bool fatal = false, + }) { + return _crashlytics.recordError( + exception, + stack, + fatal: fatal, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/logger.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/logger.dart deleted file mode 100644 index 9c58f71d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/logger.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/foundation.dart'; -import 'package:logger/logger.dart'; - -late Logger log = Logger(level: kDebugMode ? Level.verbose : Level.nothing); - -FirebaseAnalytics analytics = FirebaseAnalytics(); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart new file mode 100644 index 00000000..3adf95c1 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/remote_value_service.dart @@ -0,0 +1,24 @@ +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:flutter/foundation.dart'; + +/// Wrapper around [FirebaseRemoteConfig]. +class RemoteValueService { + static const _gridQuotesViewEnabledKey = 'grid_quotes_view_enabled'; + + RemoteValueService({ + @visibleForTesting FirebaseRemoteConfig? remoteConfig, + }) : _remoteConfig = remoteConfig ?? FirebaseRemoteConfig.instance; + + final FirebaseRemoteConfig _remoteConfig; + + Future load() async { + await _remoteConfig.setDefaults({ + _gridQuotesViewEnabledKey: true, + }); + await _remoteConfig.fetchAndActivate(); + } + + bool get isGridQuotesViewEnabled => _remoteConfig.getBool( + _gridQuotesViewEnabledKey, + ); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.lock deleted file mode 100644 index 374a480d..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.lock +++ /dev/null @@ -1,455 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" - firebase_analytics: - dependency: "direct main" - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "8.3.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0+1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logger: - dependency: "direct main" - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.12.13+hotfix.5" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.yaml index d5253b00..9ee1fb00 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/pubspec.yaml @@ -1,5 +1,4 @@ name: monitoring -version: 0.0.1 publish_to: none environment: @@ -8,8 +7,11 @@ environment: dependencies: flutter: sdk: flutter - firebase_analytics: ^8.3.0 - logger: ^1.0.0 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/test/common_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config.json deleted file mode 100644 index 614f6a7a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,452 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "quote_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.13" - } - ], - "generated": "2022-04-19T00:26:46.745402Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config_subset deleted file mode 100644 index 0ed407e9..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,297 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -quote_repository -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/quote_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins deleted file mode 100644 index 099337ca..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins +++ /dev/null @@ -1,5 +0,0 @@ -# This is a generated file; do not edit or check into version control. -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins-dependencies deleted file mode 100644 index ffbf22f2..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:46.914884","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.packages deleted file mode 100644 index de5044e6..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/.packages +++ /dev/null @@ -1,80 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:46.727295. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -quote_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/pubspec.lock deleted file mode 100644 index df68ba29..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/quote_repository/pubspec.lock +++ /dev/null @@ -1,513 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: "direct main" - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config.json b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config.json deleted file mode 100644 index 803c0d46..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config.json +++ /dev/null @@ -1,464 +0,0 @@ -{ - "configVersion": 2, - "packages": [ - { - "name": "_fe_analyzer_shared", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "analyzer", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "args", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "async", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "boolean_selector", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "characters", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "charcode", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "cli_util", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "collection", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "convert", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "coverage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "crypto", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "dio", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "domain_models", - "rootUri": "../../domain_models", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "equatable", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "fav_qs_api", - "rootUri": "../../fav_qs_api", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "ffi", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "file", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter", - "rootUri": "file:///Users/vid/flutter/packages/flutter", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "flutter_secure_storage", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "frontend_server_client", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "glob", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "hive", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_multi_server", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "http_parser", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "io", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "js", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "json_annotation", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "key_value_storage", - "rootUri": "../../key_value_storage", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "lints", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "logging", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "matcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "material_color_utilities", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "meta", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mime", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "mocktail", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "node_preamble", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "package_config", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_linux", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_macos", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "path_provider_windows", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pedantic", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "platform", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "plugin_platform_interface", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pool", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "process", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "pub_semver", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "rxdart", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_packages_handler", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_static", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "shelf_web_socket", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "sky_engine", - "rootUri": "file:///Users/vid/flutter/bin/cache/pkg/sky_engine", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_map_stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_maps", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "source_span", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stack_trace", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "stream_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "string_scanner", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "term_glyph", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_api", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "test_core", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "typed_data", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "vector_math", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1", - "packageUri": "lib/", - "languageVersion": "2.14" - }, - { - "name": "vm_service", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "watcher", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "web_socket_channel", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "webkit_inspection_protocol", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "win32", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5", - "packageUri": "lib/", - "languageVersion": "2.13" - }, - { - "name": "xdg_directories", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "yaml", - "rootUri": "file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0", - "packageUri": "lib/", - "languageVersion": "2.12" - }, - { - "name": "user_repository", - "rootUri": "../", - "packageUri": "lib/", - "languageVersion": "2.14" - } - ], - "generated": "2022-04-19T00:26:49.578055Z", - "generator": "pub", - "generatorVersion": "2.16.2" -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config_subset b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config_subset deleted file mode 100644 index 60d90212..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/package_config_subset +++ /dev/null @@ -1,305 +0,0 @@ -domain_models -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/domain_models/lib/ -fav_qs_api -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/lib/ -key_value_storage -2.13 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/key_value_storage/lib/ -user_repository -2.14 -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/ -file:///Users/vid/Projects/Current/raywenderlich/books/rwf-materials/10-create-your-own-widget-catalog/projects/final/packages/user_repository/lib/ -_fe_analyzer_shared -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -equatable -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -ffi -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter_secure_storage -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -lints -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -source_map_stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math -2.14 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32 -2.13 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml -2.12 -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/ -file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -sky_engine -2.12 -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/ -file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -flutter -2.12 -file:///Users/vid/flutter/packages/flutter/ -file:///Users/vid/flutter/packages/flutter/lib/ -2 diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/version b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/version deleted file mode 100644 index 55f001e4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.dart_tool/version +++ /dev/null @@ -1 +0,0 @@ -2.10.4 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins deleted file mode 100644 index ce23dbe4..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins +++ /dev/null @@ -1,6 +0,0 @@ -# This is a generated file; do not edit or check into version control. -flutter_secure_storage=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/ -path_provider=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/ -path_provider_linux=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/ -path_provider_macos=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/ -path_provider_windows=/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins-dependencies b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins-dependencies deleted file mode 100644 index 239b631e..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.flutter-plugins-dependencies +++ /dev/null @@ -1 +0,0 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"android":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/","dependencies":[]}],"linux":[{"name":"flutter_secure_storage","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/","dependencies":[]},{"name":"path_provider_linux","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_secure_storage","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-19 02:26:49.745988","version":"2.10.4"} \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.packages b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.packages deleted file mode 100644 index e366791a..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/.packages +++ /dev/null @@ -1,82 +0,0 @@ -# This file is deprecated. Tools should instead consume -# `.dart_tool/package_config.json`. -# -# For more info see: https://dart.dev/go/dot-packages-deprecation -# -# Generated by pub on 2022-04-19 02:26:49.551545. -_fe_analyzer_shared:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-25.0.0/lib/ -analyzer:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/analyzer-2.2.0/lib/ -args:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/args-2.2.0/lib/ -async:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.8.2/lib/ -boolean_selector:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/ -characters:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.2.0/lib/ -charcode:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.3.1/lib/ -cli_util:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/cli_util-0.3.3/lib/ -collection:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/ -convert:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/convert-3.0.1/lib/ -coverage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/coverage-1.0.3/lib/ -crypto:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/ -dio:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.0/lib/ -domain_models:../domain_models/lib/ -equatable:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-2.0.3/lib/ -fav_qs_api:../fav_qs_api/lib/ -ffi:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.1.2/lib/ -file:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.2/lib/ -flutter:file:///Users/vid/flutter/packages/flutter/lib/ -flutter_secure_storage:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/lib/ -frontend_server_client:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/frontend_server_client-2.1.1/lib/ -glob:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/glob-2.0.1/lib/ -hive:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/hive-2.0.4/lib/ -http_multi_server:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_multi_server-3.0.1/lib/ -http_parser:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/ -io:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/io-1.0.3/lib/ -js:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.3/lib/ -json_annotation:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/json_annotation-4.0.1/lib/ -key_value_storage:../key_value_storage/lib/ -lints:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/lints-1.0.1/lib/ -logging:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/logging-1.0.1/lib/ -matcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.11/lib/ -material_color_utilities:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/material_color_utilities-0.1.3/lib/ -meta:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.7.0/lib/ -mime:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mime-1.0.0/lib/ -mocktail:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/mocktail-0.1.4/lib/ -node_preamble:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/node_preamble-2.0.1/lib/ -package_config:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/package_config-2.0.0/lib/ -path:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/ -path_provider:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/ -path_provider_linux:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.2/lib/ -path_provider_macos:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.2/lib/ -path_provider_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/ -path_provider_windows:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.3/lib/ -pedantic:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.1/lib/ -platform:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.2/lib/ -plugin_platform_interface:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.1/lib/ -pool:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0/lib/ -process:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.3/lib/ -pub_semver:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/pub_semver-2.0.0/lib/ -rxdart:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.27.1/lib/ -shelf:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf-1.2.0/lib/ -shelf_packages_handler:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-3.0.0/lib/ -shelf_static:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_static-1.1.0/lib/ -shelf_web_socket:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-1.0.1/lib/ -sky_engine:file:///Users/vid/flutter/bin/cache/pkg/sky_engine/lib/ -source_map_stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0/lib/ -source_maps:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10/lib/ -source_span:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/ -stack_trace:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/ -stream_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/ -string_scanner:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/ -term_glyph:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/ -test:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test-1.17.11/lib/ -test_api:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.4.3/lib/ -test_core:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/test_core-0.4.1/lib/ -typed_data:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/ -vector_math:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.1/lib/ -vm_service:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-7.2.0/lib/ -watcher:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/watcher-1.0.0/lib/ -web_socket_channel:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-2.1.0/lib/ -webkit_inspection_protocol:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-1.0.0/lib/ -win32:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.2.5/lib/ -xdg_directories:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/ -yaml:file:///Users/vid/flutter/.pub-cache/hosted/pub.dartlang.org/yaml-3.1.0/lib/ -user_repository:lib/ diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/cache_to_domain.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/cache_to_domain.dart index 85f78b5a..d989044e 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/cache_to_domain.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/cache_to_domain.dart @@ -13,12 +13,3 @@ extension DarkModePreferenceCMToDomain on DarkModePreferenceCM { } } } - -extension UserCMToDomain on UserCM { - User toDomainModel() { - return User( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/mappers.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/mappers.dart index 529b9b9b..a6836bb8 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/mappers.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/mappers.dart @@ -1,3 +1,3 @@ export 'cache_to_domain.dart'; export 'domain_to_cache.dart'; -export 'remote_to_cache.dart'; +export 'remote_to_domain.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_cache.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_cache.dart deleted file mode 100644 index d10ee8c1..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_cache.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension UserRMToCM on UserRM { - UserCM toCacheModel() { - return UserCM( - username: username, - email: email, - ); - } -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_domain.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_domain.dart new file mode 100644 index 00000000..30e42e34 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/mappers/remote_to_domain.dart @@ -0,0 +1,11 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:fav_qs_api/fav_qs_api.dart'; + +extension UserRMToDomain on UserRM { + User toDomainModel() { + return User( + username: username, + email: email, + ); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_local_storage.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_local_storage.dart index 2d22639f..ef246492 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_local_storage.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_local_storage.dart @@ -16,19 +16,4 @@ class UserLocalStorage { final box = await noSqlStorage.darkModePreferenceBox; return box.get(0); } - - Future upsertUser(UserCM user) async { - final box = await noSqlStorage.userBox; - await box.put(0, user); - } - - Future getUser() async { - final box = await noSqlStorage.userBox; - return box.get(0); - } - - Future deleteUser() async { - final box = await noSqlStorage.userBox; - await box.clear(); - } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_repository.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_repository.dart index d90ed47c..8562502c 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_repository.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_repository.dart @@ -1,4 +1,3 @@ -import 'package:async/async.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:key_value_storage/key_value_storage.dart'; @@ -26,18 +25,6 @@ class UserRepository { final BehaviorSubject _userSubject = BehaviorSubject(); final BehaviorSubject _darkModePreferenceSubject = BehaviorSubject(); - late final AsyncMemoizer _userTokenNormalizationMemoizer = AsyncMemoizer() - ..runOnce( - () async { - // If the app is uninstalled while the user was authenticated, we need to - // manually delete the token from our secure storage, since it persists - // between app installs. - final user = await _localStorage.getUser(); - if (user == null) { - await _secureStorage.deleteUserToken(); - } - }, - ); Future upsertDarkModePreference(DarkModePreference preference) async { await _localStorage.upsertDarkModePreference( @@ -60,23 +47,21 @@ class UserRepository { Future signIn(String email, String password) async { try { - final user = await remoteApi.signIn( + final apiUser = await remoteApi.signIn( email, password, ); - final cacheUser = user.toCacheModel(); - await Future.wait([ - _secureStorage.upsertUserToken( - user.token, - ), - _localStorage.upsertUser( - cacheUser, - ) - ]); + await _secureStorage.upsertUserInfo( + username: apiUser.username, + email: apiUser.email, + token: apiUser.token, + ); + + final domainUser = apiUser.toDomainModel(); _userSubject.add( - cacheUser.toDomainModel(), + domainUser, ); } on InvalidCredentialsFavQsException catch (_) { throw InvalidCredentialsException(); @@ -85,13 +70,35 @@ class UserRepository { Stream getUser() async* { if (!_userSubject.hasValue) { - final cachedUser = await _localStorage.getUser(); - _userSubject.add(cachedUser?.toDomainModel()); + final userInfo = await Future.wait([ + _secureStorage.getUserEmail(), + _secureStorage.getUsername(), + ]); + + final email = userInfo[0]; + final username = userInfo[1]; + + if (email != null && username != null) { + _userSubject.add( + User( + email: email, + username: username, + ), + ); + } else { + _userSubject.add( + null, + ); + } } yield* _userSubject.stream; } + Future getUserToken() { + return _secureStorage.getUserToken(); + } + Future signUp( String username, String email, @@ -104,22 +111,17 @@ class UserRepository { password, ); - final cacheUser = UserCM( + await _secureStorage.upsertUserInfo( username: username, email: email, + token: userToken, ); - await Future.wait([ - _localStorage.upsertUser( - cacheUser, - ), - _secureStorage.upsertUserToken( - userToken, - ), - ]); - _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } catch (error) { if (error is UsernameAlreadyTakenFavQsException) { @@ -142,14 +144,17 @@ class UserRepository { email, newPassword, ); - final cacheUser = UserCM( + + await _secureStorage.upsertUserInfo( username: username, email: email, ); - await _localStorage.upsertUser(cacheUser); _userSubject.add( - cacheUser.toDomainModel(), + User( + username: username, + email: email, + ), ); } on UsernameAlreadyTakenFavQsException catch (_) { throw UsernameAlreadyTakenException(); @@ -158,22 +163,11 @@ class UserRepository { Future signOut() async { await remoteApi.signOut(); - await Future.wait( - [ - _localStorage.deleteUser(), - _secureStorage.deleteUserToken(), - ], - ); + await _secureStorage.deleteUserInfo(); _userSubject.add(null); } Future requestPasswordResetEmail(String email) async { await remoteApi.requestPasswordResetEmail(email); } - - Future getUserToken() async { - await _userTokenNormalizationMemoizer.future; - final userToken = await _secureStorage.getUserToken(); - return userToken; - } } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_secure_storage.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_secure_storage.dart index 57f93b91..f696a44f 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_secure_storage.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/lib/src/user_secure_storage.dart @@ -1,7 +1,9 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class UserSecureStorage { - static const _userTokenKey = 'fav-qs-user-token'; + static const _tokenKey = 'wonder-words-token'; + static const _usernameKey = 'wonder-words-username'; + static const _emailKey = 'wonder-words-email'; const UserSecureStorage({ FlutterSecureStorage? secureStorage, @@ -9,16 +11,48 @@ class UserSecureStorage { final FlutterSecureStorage _secureStorage; - Future upsertUserToken(String token) => _secureStorage.write( - key: _userTokenKey, - value: token, + Future upsertUserInfo({ + required String username, + required String email, + String? token, + }) => + Future.wait([ + _secureStorage.write( + key: _emailKey, + value: email, + ), + _secureStorage.write( + key: _usernameKey, + value: username, + ), + if (token != null) + _secureStorage.write( + key: _tokenKey, + value: token, + ) + ]); + + Future deleteUserInfo() => Future.wait([ + _secureStorage.delete( + key: _tokenKey, + ), + _secureStorage.delete( + key: _usernameKey, + ), + _secureStorage.delete( + key: _emailKey, + ), + ]); + + Future getUserToken() => _secureStorage.read( + key: _tokenKey, ); - Future deleteUserToken() => _secureStorage.delete( - key: _userTokenKey, + Future getUserEmail() => _secureStorage.read( + key: _emailKey, ); - Future getUserToken() => _secureStorage.read( - key: _userTokenKey, + Future getUsername() => _secureStorage.read( + key: _usernameKey, ); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.lock deleted file mode 100644 index 0aaed3e7..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.lock +++ /dev/null @@ -1,527 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "25.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - coverage: - dependency: transitive - description: - name: coverage - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - domain_models: - dependency: "direct main" - description: - path: "../domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fav_qs_api: - dependency: "direct main" - description: - path: "../fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - flutter: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.1" - key_value_storage: - dependency: "direct main" - description: - path: "../key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: "direct dev" - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - mocktail: - dependency: "direct dev" - description: - name: mocktail - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - package_config: - dependency: transitive - description: - name: package_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - pool: - dependency: transitive - description: - name: pool - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.3" - pub_semver: - dependency: transitive - description: - name: pub_semver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - rxdart: - dependency: "direct main" - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.1" - shelf: - dependency: transitive - description: - name: shelf - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - shelf_static: - dependency: transitive - description: - name: shelf_static - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - source_maps: - dependency: transitive - description: - name: source_maps - url: "https://pub.dartlang.org" - source: hosted - version: "0.10.10" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test: - dependency: "direct dev" - description: - name: test - url: "https://pub.dartlang.org" - source: hosted - version: "1.17.11" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.3" - test_core: - dependency: transitive - description: - name: test_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - vm_service: - dependency: transitive - description: - name: vm_service - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.0" - watcher: - dependency: transitive - description: - name: watcher - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.5" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" -sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/common_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.mocks.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/propagate-config-files.sh b/11-create-your-own-widget-catalog/projects/challenge/propagate-config-files.sh new file mode 100644 index 00000000..e27a6bf9 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/propagate-config-files.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Copyright (c) 2021 Razeware LLC +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# Notwithstanding the foregoing, you may not use, copy, modify, +# merge, publish, distribute, sublicense, create a derivative work, +# and/or sell copies of the Software in any work that is designed, +# intended, or marketed for pedagogical or instructional purposes +# related to programming, coding, application development, or +# information technology. Permission for such use, copying, +# modification, merger, publication, distribution, sublicensing, +# creation of derivative works, or sale is expressly withheld. +# +# This project and source code may use libraries or frameworks +# that are released under various Open-Source licenses. Use of +# those libraries and frameworks are governed by their own +# individual licenses. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +DEBUG=false +if [ "$DEBUG" = true ]; then + STD_OUT=/dev/tty +else + STD_OUT=/dev/null +fi + +if [[ "$OSTYPE" == "darwin"* ]]; then + IS_MACOS=true +else + IS_MACOS=false +fi + +SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +WANTED_SUBFOLDER_1='.idea' +WANTED_SUBFOLDER_2='.vscode' + +WANTED_SUBFOLDER_3='android/app/src/google-services.json' +WANTED_SUBFOLDER_4='ios/Runner/GoogleService-Info.plist' + +ARR_WANTED=( + "${WANTED_SUBFOLDER_1}" + "${WANTED_SUBFOLDER_2}" + "${WANTED_SUBFOLDER_3}" + "${WANTED_SUBFOLDER_4}" +) + +# Get root directory: /mnt/c/scripts/epidemy/ +ROOT_DIR="$(dirname "$(dirname "$(dirname "$(echo $SCRIPT_DIR)")")")" + +# Double check our core locations aren't empty +[ -z "$ROOT_DIR" ] && echo 'ROOT_DIR variable is unset!' && exit 1 +[ -z "$SCRIPT_DIR" ] && echo 'SCRIPT_DIR variable is unset!' && exit 1 + +# All folders within root (e.g. 01-, 02-, 03-, 04-) +ALL_ROOT=$(find "${ROOT_DIR}" -maxdepth 3 -type d | grep -E '/[0-9]{2}[^/]*/projects/(starter|final|challenge)') + +# Just the folders we care about (not template) +FOLDERS=$(printf "${ALL_ROOT}" | grep -v $(printf ${SCRIPT_DIR})) + +{ + echo + echo ===Found Folders=== + echo '(Template)' $SCRIPT_DIR + echo "${FOLDERS}" + + echo + echo ===Creating Items=== + printf "${FOLDERS}\n" | while read root ; do + + echo $root + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + dest_item="${root}/${wanted}" + dest_dir=$(dirname "${dest_item}") + + # Ensure template file exists + if [[ ! -e "${orig_item}" ]]; then + continue + fi + + # Skip item if there isn't a path to copy destination + if [ ! -d "${dest_dir}" ]; then + printf "\tDestination Directory Missing - ${wanted}\n" + continue + fi + + # =============COPY============= # + if [ "$IS_MACOS" = true ]; then + # Doesn't support -T, uses source trailing / + cp -r "${orig_item}" "${dest_item}" + else + # -T to copy entire folder, instead of contents + cp -rT "${orig_item}" "${dest_item}" + fi + printf "\tCreated! - ${wanted}\n" + # =============COPY============= # + + done + echo + done + + echo + echo ===Issues=== + + # Print an error only if we're missing both + ERR_IF_BOTH_1=( + "/src/google-services.json$" + "/Runner/GoogleService-Info.plist$" + ) + BOTH_MISSING_1=true + + # Print an error only if we're missing both + ERR_IF_BOTH_2=( + ".idea$" + ".vscode$" + ) + BOTH_MISSING_2=true + + # Don't perform basic missing check on these items + # Use this if other checks should be used, e.g. ERR_IF_BOTH + # Uses regex to check, note the $ for EOL and the OR symbol + NO_ERR="\/(src|Runner)\/(GoogleService-Info.plist|google-services.json)$" + NO_ERR="${NO_ERR}|\.(vscode|idea)$" + + for wanted in "${ARR_WANTED[@]}"; do + orig_item="${SCRIPT_DIR}/${wanted}" + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_1[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_1 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_1=false + + # End this checker if found a match + [ "$BOTH_MISSING_1" = false ] && break + fi + done + + # Loop through and check if $wanted matches + for check in "${ERR_IF_BOTH_2[@]}"; do + + # Check current item + echo "${wanted}" | grep -Eq ${check} + + # Current item is in ERR_IF_BOTH_2 + if [ $? -eq 0 ]; then + + # Update flag if item does exist + [ -e "${orig_item}" ] && BOTH_MISSING_2=false + + # End this checker if found a match + [ "$BOTH_MISSING_2" = false ] && break + fi + done + + # Don't print missing file error, + # If item path matches NO_ERR pattern + echo ${wanted} | grep -Eq ${NO_ERR} + [ $? -eq 0 ] && continue + + # Generic file missing error + [ ! -e "${orig_item}" ] && echo "${orig_item} Does not exist!" 1>&2 + done + + [ "$BOTH_MISSING_1" = true ] && echo "Your Firebase configuration file(s) couldn’t be found. Please, make sure you have configured at least the dev app for Android or iOS. You won't be able to run the app otherwise." 1>&2 && exit 1 + [ "$BOTH_MISSING_2" = true ] && echo "Your IDE’s custom running configs couldn’t be found. Please, try following the instructions again, or you'll need to run the app from the command line every time by using: flutter run --dart-define=fav-qs-app-token=YOUR_KEY" 1>&2 && exit 1 + +} > $STD_OUT + +echo Done! +exit 0 diff --git a/11-create-your-own-widget-catalog/projects/challenge/pubspec.lock b/11-create-your-own-widget-catalog/projects/challenge/pubspec.lock index 6e343e37..803bac5d 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/pubspec.lock +++ b/11-create-your-own-widget-catalog/projects/challenge/pubspec.lock @@ -7,35 +7,35 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" bloc: dependency: transitive description: name: bloc url: "https://pub.dartlang.org" source: hosted - version: "8.0.2" + version: "8.0.3" + bloc_concurrency: + dependency: transitive + description: + name: bloc_concurrency + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" boolean_selector: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -84,21 +84,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" dio: dependency: transitive description: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -133,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -141,62 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: "direct main" - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.1" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.6.6" + firebase_crashlytics: + dependency: transitive + description: + name: firebase_crashlytics + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.4" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.10" firebase_dynamic_links: - dependency: "direct main" + dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" + firebase_remote_config: + dependency: transitive + description: + name: firebase_remote_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + firebase_remote_config_platform_interface: + dependency: transitive + description: + name: firebase_remote_config_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.10" + firebase_remote_config_web: + dependency: transitive + description: + name: firebase_remote_config_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -209,13 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -241,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -279,14 +312,12 @@ packages: name: formz url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" - graphs: + version: "0.4.1" + fuchsia_remote_debug_protocol: dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -294,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.3" http_parser: dependency: transitive description: @@ -308,22 +332,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - image: + infinite_scroll_pagination: dependency: transitive description: - name: image + name: infinite_scroll_pagination url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" - infinite_scroll_pagination: - dependency: transitive - description: - path: "." - ref: "feature/staggered-grid" - resolved-ref: cd75af58e17f385218425c96a2baceee08bb086a - url: "git://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "3.1.0" + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -337,14 +357,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -359,55 +379,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" - logger: - dependency: transitive - description: - name: logger - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - lottie: - dependency: transitive - description: - name: lottie - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: path: "packages/monitoring" relative: true source: path - version: "0.0.1" + version: "0.0.0" nested: dependency: transitive description: @@ -415,27 +421,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: "direct main" - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.1" + version: "0.5.1+1" path_parsing: dependency: transitive description: @@ -449,70 +448,77 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.10" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.14" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "2.0.6" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.4.0" platform: dependency: transitive description: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.2" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" profile_menu: dependency: "direct main" description: @@ -548,69 +554,62 @@ packages: relative: true source: path version: "0.0.0" - rive: - dependency: transitive - description: - name: rive - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.28" routemaster: dependency: "direct main" description: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "0.9.5" + version: "1.0.1" rxdart: dependency: transitive description: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.1" + version: "0.27.3" share_plus: dependency: transitive description: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -636,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -658,34 +657,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -699,42 +712,56 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.9" + version: "6.1.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "2.0.5" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -748,35 +775,42 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.5" + version: "2.5.2" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" - yaml: - dependency: transitive - description: - name: yaml - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" + version: "5.3.1" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/11-create-your-own-widget-catalog/projects/challenge/pubspec.yaml b/11-create-your-own-widget-catalog/projects/challenge/pubspec.yaml index 7c92d0b7..b2dd1e71 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/pubspec.yaml +++ b/11-create-your-own-widget-catalog/projects/challenge/pubspec.yaml @@ -25,12 +25,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^0.9.5 - firebase: ^9.0.1 - firebase_dynamic_links: ^2.0.7 - package_info: ^2.0.2 - monitoring: - path: packages/monitoring + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -57,17 +52,21 @@ dependencies: path: packages/domain_models component_library: path: packages/component_library + monitoring: + path: packages/monitoring # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter - flutter_launcher_icons: ^0.9.0 flutter_lints: ^1.0.4 - + + flutter_icons: android: true ios: true @@ -83,34 +82,4 @@ 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 - - # To add assets to your application, add an assets section, like this: - assets: - - assets/animations/ - - # 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 + uses-material-design: true \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/test/example_test.dart b/11-create-your-own-widget-catalog/projects/challenge/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/11-create-your-own-widget-catalog/projects/challenge/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From 9f2b02562c203e48d67af3eb95e88ac0df15823a Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:06:41 +0200 Subject: [PATCH 09/30] Generating platform folders for storybook for remaining chapters --- .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../component_library/example/.metadata | 39 +- .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../example/test/widget_test.dart | 30 + .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ 224 files changed, 10880 insertions(+), 8 deletions(-) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/main.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/main.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/resource.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/main.cc create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 14-automated-testing/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/main.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Info.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/Runner.rc create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/main.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/resource.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.h diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/main.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 zcmaiYXH?Tqu=Xz`p-L#B_gI#0we$cm_HcmYFP$?wjD#BaCN4mzC5#`>w9y6=ThxrYZc0WPXprg zYjB`UsV}0=eUtY$(P6YW}npdd;%9pi?zS3k-nqCob zSX_AQEf|=wYT3r?f!*Yt)ar^;l3Sro{z(7deUBPd2~(SzZ-s@0r&~Km2S?8r##9-< z)2UOSVaHqq6}%sA9Ww;V2LG=PnNAh6mA2iWOuV7T_lRDR z&N8-eN=U)-T|;wo^Wv=34wtV0g}sAAe}`Ph@~!|<;z7*K8(qkX0}o=!(+N*UWrkEja*$_H6mhK1u{P!AC39} z|3+Z(mAOq#XRYS)TLoHv<)d%$$I@+x+2)V{@o~~J-!YUI-Q9%!Ldi4Op&Lw&B>jj* zwAgC#Y>gbIqv!d|J5f!$dbCXoq(l3GR(S>(rtZ~Z*agXMMKN!@mWT_vmCbSd3dUUm z4M&+gz?@^#RRGal%G3dDvj7C5QTb@9+!MG+>0dcjtZEB45c+qx*c?)d<%htn1o!#1 zpIGonh>P1LHu3s)fGFF-qS}AXjW|M*2Xjkh7(~r(lN=o#mBD9?jt74=Rz85I4Nfx_ z7Z)q?!};>IUjMNM6ee2Thq7))a>My?iWFxQ&}WvsFP5LP+iGz+QiYek+K1`bZiTV- zHHYng?ct@Uw5!gquJ(tEv1wTrRR7cemI>aSzLI^$PxW`wL_zt@RSfZ1M3c2sbebM* ze0=;sy^!90gL~YKISz*x;*^~hcCoO&CRD)zjT(A2b_uRue=QXFe5|!cf0z1m!iwv5GUnLw9Dr*Ux z)3Lc!J@Ei;&&yxGpf2kn@2wJ2?t6~obUg;?tBiD#uo$SkFIasu+^~h33W~`r82rSa ztyE;ehFjC2hjpJ-e__EH&z?!~>UBb=&%DS>NT)1O3Isn-!SElBV2!~m6v0$vx^a<@ISutdTk1@?;i z<8w#b-%|a#?e5(n@7>M|v<<0Kpg?BiHYMRe!3Z{wYc2hN{2`6(;q`9BtXIhVq6t~KMH~J0~XtUuT06hL8c1BYZWhN zk4F2I;|za*R{ToHH2L?MfRAm5(i1Ijw;f+0&J}pZ=A0;A4M`|10ZskA!a4VibFKn^ zdVH4OlsFV{R}vFlD~aA4xxSCTTMW@Gws4bFWI@xume%smAnuJ0b91QIF?ZV!%VSRJ zO7FmG!swKO{xuH{DYZ^##gGrXsUwYfD0dxXX3>QmD&`mSi;k)YvEQX?UyfIjQeIm! z0ME3gmQ`qRZ;{qYOWt}$-mW*>D~SPZKOgP)T-Sg%d;cw^#$>3A9I(%#vsTRQe%moT zU`geRJ16l>FV^HKX1GG7fR9AT((jaVb~E|0(c-WYQscVl(z?W!rJp`etF$dBXP|EG z=WXbcZ8mI)WBN>3<@%4eD597FD5nlZajwh8(c$lum>yP)F}=(D5g1-WVZRc)(!E3} z-6jy(x$OZOwE=~{EQS(Tp`yV2&t;KBpG*XWX!yG+>tc4aoxbXi7u@O*8WWFOxUjcq z^uV_|*818$+@_{|d~VOP{NcNi+FpJ9)aA2So<7sB%j`$Prje&auIiTBb{oD7q~3g0 z>QNIwcz(V-y{Ona?L&=JaV5`o71nIsWUMA~HOdCs10H+Irew#Kr(2cn>orG2J!jvP zqcVX0OiF}c<)+5&p}a>_Uuv)L_j}nqnJ5a?RPBNi8k$R~zpZ33AA4=xJ@Z($s3pG9 zkURJY5ZI=cZGRt_;`hs$kE@B0FrRx(6K{`i1^*TY;Vn?|IAv9|NrN*KnJqO|8$e1& zb?OgMV&q5|w7PNlHLHF) zB+AK#?EtCgCvwvZ6*u|TDhJcCO+%I^@Td8CR}+nz;OZ*4Dn?mSi97m*CXXc=};!P`B?}X`F-B5v-%ACa8fo0W++j&ztmqK z;&A)cT4ob9&MxpQU41agyMU8jFq~RzXOAsy>}hBQdFVL%aTn~M>5t9go2j$i9=(rZ zADmVj;Qntcr3NIPPTggpUxL_z#5~C!Gk2Rk^3jSiDqsbpOXf^f&|h^jT4|l2ehPat zb$<*B+x^qO8Po2+DAmrQ$Zqc`1%?gp*mDk>ERf6I|42^tjR6>}4`F_Mo^N(~Spjcg z_uY$}zui*PuDJjrpP0Pd+x^5ds3TG#f?57dFL{auS_W8|G*o}gcnsKYjS6*t8VI<) zcjqTzW(Hk*t-Qhq`Xe+x%}sxXRerScbPGv8hlJ;CnU-!Nl=# zR=iTFf9`EItr9iAlAGi}i&~nJ-&+)Y| zMZigh{LXe)uR+4D_Yb+1?I93mHQ5{pId2Fq%DBr7`?ipi;CT!Q&|EO3gH~7g?8>~l zT@%*5BbetH)~%TrAF1!-!=)`FIS{^EVA4WlXYtEy^|@y@yr!C~gX+cp2;|O4x1_Ol z4fPOE^nj(}KPQasY#U{m)}TZt1C5O}vz`A|1J!-D)bR%^+=J-yJsQXDzFiqb+PT0! zIaDWWU(AfOKlSBMS};3xBN*1F2j1-_=%o($ETm8@oR_NvtMDVIv_k zlnNBiHU&h8425{MCa=`vb2YP5KM7**!{1O>5Khzu+5OVGY;V=Vl+24fOE;tMfujoF z0M``}MNnTg3f%Uy6hZi$#g%PUA_-W>uVCYpE*1j>U8cYP6m(>KAVCmbsDf39Lqv0^ zt}V6FWjOU@AbruB7MH2XqtnwiXS2scgjVMH&aF~AIduh#^aT1>*V>-st8%=Kk*{bL zzbQcK(l2~)*A8gvfX=RPsNnjfkRZ@3DZ*ff5rmx{@iYJV+a@&++}ZW+za2fU>&(4y`6wgMpQGG5Ah(9oGcJ^P(H< zvYn5JE$2B`Z7F6ihy>_49!6}(-)oZ(zryIXt=*a$bpIw^k?>RJ2 zQYr>-D#T`2ZWDU$pM89Cl+C<;J!EzHwn(NNnWpYFqDDZ_*FZ{9KQRcSrl5T>dj+eA zi|okW;6)6LR5zebZJtZ%6Gx8^=2d9>_670!8Qm$wd+?zc4RAfV!ZZ$jV0qrv(D`db zm_T*KGCh3CJGb(*X6nXzh!h9@BZ-NO8py|wG8Qv^N*g?kouH4%QkPU~Vizh-D3<@% zGomx%q42B7B}?MVdv1DFb!axQ73AUxqr!yTyFlp%Z1IAgG49usqaEbI_RnbweR;Xs zpJq7GKL_iqi8Md?f>cR?^0CA+Uk(#mTlGdZbuC*$PrdB$+EGiW**=$A3X&^lM^K2s zzwc3LtEs5|ho z2>U(-GL`}eNgL-nv3h7E<*<>C%O^=mmmX0`jQb6$mP7jUKaY4je&dCG{x$`0=_s$+ zSpgn!8f~ya&U@c%{HyrmiW2&Wzc#Sw@+14sCpTWReYpF9EQ|7vF*g|sqG3hx67g}9 zwUj5QP2Q-(KxovRtL|-62_QsHLD4Mu&qS|iDp%!rs(~ah8FcrGb?Uv^Qub5ZT_kn%I^U2rxo1DDpmN@8uejxik`DK2~IDi1d?%~pR7i#KTS zA78XRx<(RYO0_uKnw~vBKi9zX8VnjZEi?vD?YAw}y+)wIjIVg&5(=%rjx3xQ_vGCy z*&$A+bT#9%ZjI;0w(k$|*x{I1c!ECMus|TEA#QE%#&LxfGvijl7Ih!B2 z6((F_gwkV;+oSKrtr&pX&fKo3s3`TG@ye+k3Ov)<#J|p8?vKh@<$YE@YIU1~@7{f+ zydTna#zv?)6&s=1gqH<-piG>E6XW8ZI7&b@-+Yk0Oan_CW!~Q2R{QvMm8_W1IV8<+ zQTyy=(Wf*qcQubRK)$B;QF}Y>V6d_NM#=-ydM?%EPo$Q+jkf}*UrzR?Nsf?~pzIj$ z<$wN;7c!WDZ(G_7N@YgZ``l;_eAd3+;omNjlpfn;0(B7L)^;;1SsI6Le+c^ULe;O@ zl+Z@OOAr4$a;=I~R0w4jO`*PKBp?3K+uJ+Tu8^%i<_~bU!p%so z^sjol^slR`W@jiqn!M~eClIIl+`A5%lGT{z^mRbpv}~AyO%R*jmG_Wrng{B9TwIuS z0!@fsM~!57K1l0%{yy(#no}roy#r!?0wm~HT!vLDfEBs9x#`9yCKgufm0MjVRfZ=f z4*ZRc2Lgr(P+j2zQE_JzYmP0*;trl7{*N341Cq}%^M^VC3gKG-hY zmPT>ECyrhIoFhnMB^qpdbiuI}pk{qPbK^}0?Rf7^{98+95zNq6!RuV_zAe&nDk0;f zez~oXlE5%ve^TmBEt*x_X#fs(-En$jXr-R4sb$b~`nS=iOy|OVrph(U&cVS!IhmZ~ zKIRA9X%Wp1J=vTvHZ~SDe_JXOe9*fa zgEPf;gD^|qE=dl>Qkx3(80#SE7oxXQ(n4qQ#by{uppSKoDbaq`U+fRqk0BwI>IXV3 zD#K%ASkzd7u>@|pA=)Z>rQr@dLH}*r7r0ng zxa^eME+l*s7{5TNu!+bD{Pp@2)v%g6^>yj{XP&mShhg9GszNu4ITW=XCIUp2Xro&1 zg_D=J3r)6hp$8+94?D$Yn2@Kp-3LDsci)<-H!wCeQt$e9Jk)K86hvV^*Nj-Ea*o;G zsuhRw$H{$o>8qByz1V!(yV{p_0X?Kmy%g#1oSmlHsw;FQ%j9S#}ha zm0Nx09@jmOtP8Q+onN^BAgd8QI^(y!n;-APUpo5WVdmp8!`yKTlF>cqn>ag`4;o>i zl!M0G-(S*fm6VjYy}J}0nX7nJ$h`|b&KuW4d&W5IhbR;-)*9Y0(Jj|@j`$xoPQ=Cl literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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:example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/Runner.rc b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/main.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/resource.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.h b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/main.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Release.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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:example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/Runner.rc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/main.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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.CreateAndShow(L"example", 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/resource.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/runner.exe.manifest b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/14-automated-testing/projects/final/packages/component_library/example/.metadata b/14-automated-testing/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/14-automated-testing/projects/final/packages/component_library/example/.metadata +++ b/14-automated-testing/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/14-automated-testing/projects/final/packages/component_library/example/linux/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/14-automated-testing/projects/final/packages/component_library/example/linux/CMakeLists.txt b/14-automated-testing/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/final/packages/component_library/example/linux/main.cc b/14-automated-testing/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/linux/my_application.cc b/14-automated-testing/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/14-automated-testing/projects/final/packages/component_library/example/linux/my_application.h b/14-automated-testing/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/14-automated-testing/projects/final/packages/component_library/example/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? zgxkP+ytd)OMWe7QvTf8yj4;V=?m172!BEt@6*TPUT4m3)yir}esnIodFGatGnsSfJ z**;;yw=1VCb2J|A7cBz-F5QFOQh2JDQFLarE>;4ZMzQ$s^)fOscIVv2-o{?ct3~Zv zy{0zU>3`+-PluS|ADraI9n~=3#Tvfx{pDr^5i$^-h5tL*CV@AeQFLxv4Y<$xI{9y< zZ}li*WIQ+XS!IK;?IVD0)C?pNBA(DMxqozMy1L#j+ba1Cd+2w&{^d-OEWSSHmNH>9 z%1Ldo(}5*>a8rjQF&@%Ka`-M|HM+m<^E#bJtVg&YM}uMb7UVJ|OVQI-zt-*BqQ zG&mq`Bn7EY;;+b%Obs9i{gC^%>kUz`{Qnc=ps7ra_UxEP$!?f&|5fHnU(rr?7?)D z$3m9e{&;Zu6yfa1ixTr;80IP7KLgkKCbgv1%f_weZK6b7tY+AS%fyjf6dR(wQa9TD zYG9`#!N4DqpMim|{uViKVf0B+Vmsr7p)Y+;*T~-2HFr!IOedrpiXXz+BDppd5BTf3 ztsg4U?0wR?9@~`iV*nwGmtYFGnq`X< zf?G%=o!t50?gk^qN#J(~!sxi=_yeg?Vio04*w<2iBT+NYX>V#CFuQGLsX^u8dPIkP zPraQK?ro`rqA4t7yUbGYk;pw6Z})Bv=!l-a5^R5Ra^TjoXI?=Qdup)rtyhwo<(c9_ zF>6P%-6Aqxb8gf?wY1z!4*hagIch)&A4treifFk=E9v@kRXyMm?V*~^LEu%Y%0u(| z52VvVF?P^D<|fG)_au(!iqo~1<5eF$Sc5?)*$4P3MAlSircZ|F+9T66-$)0VUD6>e zl2zlSl_QQ?>ULUA~H?QbWazYeh61%B!!u;c(cs`;J|l z=7?q+vo^T#kzddr>C;VZ5h*;De8^F2y{iA#9|(|5@zYh4^FZ-3r)xej=GghMN3K2Y z=(xE`TM%V8UHc4`6Cdhz4%i0OY^%DSguLUXQ?Y3LP+5x3jyN)-UDVhEC}AI5wImt; zHY|*=UW}^bS3va-@L$-fJz2P2LbCl)XybkY)p%2MjPJd-FzkdyWW~NBC@NlPJkz{v z+6k6#nif`E>>KCGaP34oY*c#nBFm#G8a0^px1S6mm6Cs+d}E8{J;DX=NEHb|{fZm0 z@Ors@ebTgbf^Jg&DzVS|h&Or)56$+;%&sh0)`&6VkS@QxQ=#6WxF5g+FWSr7Lp9uF zV#rc`yLe?f*u6oZoi3WpOkKFf^>lHb2GC6t!)dyGaQbK7&BNZ7oyP)hUX1Y(LdW-I z6LI2$i%+g!zsjT(5l}5ROLb)8`9kkldbklcq6tfLSrAyh#s(C1U2Sz9`h3#T9eX#Hryi1AU^!uv*&6I~qdM_B7-@`~8#O^jN&t7+S zTKI6;T$1@`Kky-;;$rU1*TdY;cUyg$JXalGc&3-Rh zJ&7kx=}~4lEx*%NUJA??g8eIeavDIDC7hTvojgRIT$=MlpU}ff0BTTTvjsZ0=wR)8 z?{xmc((XLburb0!&SA&fc%%46KU0e&QkA%_?9ZrZU%9Wt{*5DCUbqIBR%T#Ksp?)3 z%qL(XlnM!>F!=q@jE>x_P?EU=J!{G!BQq3k#mvFR%lJO2EU2M8egD?0r!2s*lL2Y} zdrmy`XvEarM&qTUz4c@>Zn}39Xi2h?n#)r3C4wosel_RUiL8$t;FSuga{9}-%FuOU z!R9L$Q!njtyY!^070-)|#E8My)w*~4k#hi%Y77)c5zfs6o(0zaj~nla0Vt&7bUqfD zrZmH~A50GOvk73qiyfXX6R9x3Qh)K=>#g^^D65<$5wbZjtrtWxfG4w1f<2CzsKj@e zvdsQ$$f6N=-%GJk~N7G(+-29R)Cbz8SIn_u|(VYVSAnlWZhPp8z6qm5=hvS$Y zULkbE?8HQ}vkwD!V*wW7BDBOGc|75qLVkyIWo~3<#nAT6?H_YSsvS+%l_X$}aUj7o z>A9&3f2i-`__#MiM#|ORNbK!HZ|N&jKNL<-pFkqAwuMJi=(jlv5zAN6EW`ex#;d^Z z<;gldpFcVD&mpfJ1d7><79BnCn~z8U*4qo0-{i@1$CCaw+<$T{29l1S2A|8n9ccx0!1Pyf;)aGWQ15lwEEyU35_Y zQS8y~9j9ZiByE-#BV7eknm>ba75<_d1^*% zB_xp#q`bpV1f9o6C(vbhN((A-K+f#~3EJtjWVhRm+g$1$f2scX!eZkfa%EIZd2ZVG z6sbBo@~`iwZQC4rH9w84rlHjd!|fHc9~12Il&?-FldyN50A`jzt~?_4`OWmc$qkgI zD_@7^L@cwg4WdL(sWrBYmkH;OjZGE^0*^iWZM3HBfYNw(hxh5>k@MH>AerLNqUg*Og9LiYmTgPw zX9IiqU)s?_obULF(#f~YeK#6P>;21x+cJ$KTL}|$xeG?i`zO;dAk0{Uj6GhT-p-=f zP2NJUcRJ{fZy=bbsN1Jk3q}(!&|Fkt_~GYdcBd7^JIt)Q!!7L8`3@so@|GM9b(D$+ zlD&69JhPnT>;xlr(W#x`JJvf*DPX(4^OQ%1{t@)Lkw5nc5zLVmRt|s+v zn(25v*1Z(c8RP@=3l_c6j{{=M$=*aO^ zPMUbbEKO7m2Q$4Xn>GIdwm#P_P4`or_w0+J+joK&qIP#uEiCo&RdOaP_7Z;PvfMh@ zsXUTn>ppdoEINmmq5T1BO&57*?QNLolW-8iz-jv7VAIgoV&o<<-vbD)--SD%FFOLd z>T$u+V>)4Dl6?A24xd1vgm}MovrQjf-@YH7cIk6tP^eq-xYFymnoSxcw}{lsbCP1g zE_sX|c_nq(+INR3iq+Oj^TwkjhbdOo}FmpPS2*#NGxNgl98|H0M*lu)Cu0TrA|*t=i`KIqoUl(Q7jN zb6!H-rO*!&_>-t)vG5jG>WR6z#O9O&IvA-4ho9g;as~hSnt!oF5 z6w(4pxz|WpO?HO<>sC_OB4MW)l`-E9DZJ$!=ytzO}fWXwnP>`8yWm5tYw`b1KDdg zp@oD;g===H+sj+^v6DCpEu7R?fh7>@pz>f74V5&#PvBN+95?28`mIdGR@f*L@j2%% z%;Rz5R>l#1U zYCS_5_)zUjgq#0SdO#)xEfYJ)JrHLXfe8^GK3F*CA(Y)jsSPJ{j&Ae!SeWN%Ev727 zxdd3Y0n^OBOtBSKdglEBL)i5=NdKfqK=1n~6LX`ja;#Tr!II$AAH{Z#sp%`rwNGT5 zvHT%(LJB+kD{5N}7c_Rk6}@tikIeq%@MqxX%$P!(238YD(H<_d;xxo*oMiv^1io>g zt5z&6`}cjci90q2r0hutQXr!UA~|4e*u=k81D(Cp7n{4LVCa+u0%-8Uha+sqI#Om~ z!&)KN(#Zone^~&@Ja{|l?X64Dxk)q>tLRv{=0|t$`Kdaj z#{AJr>{_BtpS|XEgTVJ4WMvBRk-(mk@ZYGdY1VwI z81;z(MBGV|2j*Cj%dvl8?b2{{B#e0B7&7wfv+>g`R2^Ai5C_WUx|CnTrHm+RFGXrt zs<~zBtk@?Niu%|o6IEL+y60Q>zJlv``ePCa07C%*O~lj?74|}&A0!uA)3V7ST8b_- z6CBP1;x+S@xTzgOY2#s%@=bhZ@i@BwmS)neQG&=9KUtRf^K=MvjC5JnqLqykCE_P0 zjf#V4SdH2#%2EuDb!>FLHK7j;nd6VLW|$3gJuegpEl3DZ`BpJU$<}}A(rW?<6OB@9 zKP9G3An?T5BztrLdlximA;{>Tr7GAeSU=^<*y;%RHj+7;v+tonyh(8d;Izn}2{oz& zW)fsZ9gHYpI?B|uekS3zHUue3mI zb7?0+&Zm>Kq(F>~%VYEn)0b32I3~O^?Wx-HI|Zu?1-OA2yfyJ;gWygLOeU;)vRm3u z5J4vDIQYztnEm=QauX2(WJO{yzI0HUFl+oO&isMf!Yh2pu@p}65)|0EdWRbg(@J6qo5_Els>#|_2a1p0&y&UP z8x#Z69q=d663NPPi>DHx3|QhJl5Ka$Cfqbvl*oRLYYXiH>g8*vriy!0XgmT~&jh3l z+!|~l=oCj<*PD>1EY*#+^a{rVk3T(66rJ^DxGt|~XTNnJf$vix1v1qdYu+d@Jn~bh z!7`a`y+IEcS#O*fSzA;I`e_T~XYzpW7alC%&?1nr);tSkNwO&J`JnX+7X1Q8fRh_d zx%)Xh_YjI3hwTCmGUeq_Z@H#ovkk_b(`osa$`aNmt`9A#t&<^jvuf z1E1DrW(%7PpAOQGwURz@luEW9-)L!`Jy*aC*4mcD?Si~mb=3Kn#M#1il9%`C0wkZ` zbpJ-qEPaOE5Y5iv_z%Wr{y4jh#U+o^KtP{pPCq-Qf&!=Uu)cEE(Iu9`uT#oHwHj+w z_R=kr7vmr~{^5sxXkj|WzNhAlXkW^oB4V)BZ{({~4ylOcM#O>DR)ZhD;RWwmf|(}y zDn)>%iwCE=*82>zP0db>I4jN#uxcYWod+<;#RtdMGPDpQW;riE;3cu``1toL|FaWa zK)MVA%ogXt3q55(Q&q+sjOG`?h=UJE9P;8i#gI*#f}@JbV(DuGEkee;La*9{p&Z?;~lE!&-kUFCtoDHY*MS zzj+S$L9+aTs(F^4ufZe6>SBg;m@>0&+kEZMFmD*~p~sx?rx=!>Ge;KYw<33y#*&77 zFZI`YE(Iz?+tH;Fq;y=MaSqT{Ayh*HFv0(z{_?Q+7@nE%p?S8%X6c!+y;!0NLXwJV8Co_}R3*7>n+oMsQpv8}8ZS-P@(Rg|gmxZHzf=nMOUAAY}AZGfWVzZjE@4$=7xkIrs8BE%606aVU%kxz_04ipig51k& z(>c9rJL2q%xvU%Zj#GR9C9)HLCR;#zQBB@x;e_9$ayn(JmSg_*0G?+wOF?&iu@}S{ zt$;TPf*Lj$3=d<}Q3o!Hq@3~lFxoiCyeEt}o3fihIn{x2s1)e2@3##&GYDq~YO|!q zUs0P-zy)+ohl-VQ`bhvUpC{-d$lkpML_M%Kl6@#_@A}w{jWCDsPa#cSbWA#C4Sf|*C*&Z{ zz?hOU7Cc`?>H$WGqITA2P~fYudnQHxB8^;0ZFKC;19F#~n_2P@{cE{Czq-#K5L_8| zc3aOEwq4%zL5>YU_mc9fc-p~{fBTWUkxTiZvxt9FOqC{s#TBp(#dWc+{Ee{dZ#B!g zHnaOJ8;KO1G;QU2ciodE+#Z$Wuz*Hc6NRO!AUMi|gov=>=cwcZeL&`>Jfn!35hV1J z;B2@0!bIR853w%T*m6)gQ?DPnQ)o6EtKaN3L;o?*q<83d&lG&U=A|6hcT?f0)4h6{ zGIZ0|!}-?*n{zr}-}cC}qWxEN%g60+{my)o^57{QEn(tSrmD7o)|r0+HVpQPopFu; z0<S}pW8W2vXzSxEqGD+qePj^x?R$e2LO&*ewsLo{+_Z)Wl|Z1K47j zsKoNRlX)h2z^ls_>IZ0!2X5t&irUs%RAO$Dr>0o$-D+$!Kb9puSgpoWza1jnX6(eG zTg-U z6|kf1atI!_>#@|=d01Ro@Rg)BD?mY3XBsG7U9%lmq>4;Gf&2k3_oyEOdEN&X6Hl5K zCz^hyt67G;IE&@w1n~%ji_{sob_ssP#Ke|qd!Xx?J&+|2K=^`WfwZ-zt|sklFouxC zXZeDgluD2a?Zd3e{MtE$gQfAY9eO@KLX;@8N`(?1-m`?AWp!a8bA%UN>QTntIcJX zvbY+C-GD&F?>E?jo$xhyKa@ps9$Dnwq>&)GB=W~2V3m)k;GNR$JoPRk%#f3#hgVdZ zhW3?cSQ*((Fog26jiEeNvum-6ID-fbfJ?q1ZU#)dgnJ^FCm`+sdP?g;d4VD$3XKx{ zs|Y4ePJp|93fpu)RL+#lIN9Ormd;<_5|oN!k5CENnpO>{60X;DN>vgHCX$QZYtgrj z*1{bEA1LKi8#U%oa!4W-4G+458~`5O4S1&tuyv>%H9DjLip7cC~RRS@HvdJ<|c z$TxEL=)r)XTfTgVxaG!gtZhLL`$#=gz1X=j|I@n~eHDUCW39r=o_ml@B z0cDx$5;3OA2l)&41kiKY^z7sO_U%1=)Ka4gV(P#(<^ z_zhThw=}tRG|2|1m4EP|p{Swfq#eNzDdi&QcVWwP+7920UQB*DpO0(tZHvLVMIGJl zdZ5;2J%a!N1lzxFwAkq05DPUg2*6SxcLRsSNI6dLiK0&JRuYAqwL}Z!YVJ$?mdnDF z82)J_t=jbY&le6Hq$Qs}@AOZGpB1}$Ah#i;&SzD1QQNwi6&1ddUf7UG0*@kX?E zDCbHypPZ9+H~KnDwBeOXZ-W-Y80wpoGB*A) z_;26Z`#s0tKrf~QBi2rl2=>;CS1w)rcD3-sB!8NI*1iQo59PJ>OLnqeV4iK7`RBi^ zFW{*6;nlD&cSunmU3v4JKj|K4xeN(q>H%;SsY8yDdw5BJ75q8>Ov)&D5OPZ`XiRHl z;)mAA0Woy6f!xCK(9H2rq?qzp83liZAIpBPl-dQ&$2=&H?Im~%g;vnIw1I+8q|kr! z36&^9}CMmR(U2rf|j12oG=vb%Ypsq8u9Kq}U*ANX*)9uK}fAi8;V_7Z;0_4*iydDxN-? zv?qJ=T*{MzL~-xUv{_Kh_q9#F{8gPV!yPUUS8pEq*=}2-#1d=sC_|U-rX~F0 zBLawgCWy#?#ax{~DAnDvh^`}wyUO`ioMK~jgh%L7^}#h?beSyvQ_g>+`2`}`-1h7# zg*?qJdm=53hwN8~B=^|LPmYtOVrQ(W{sNm4uofq=4P@dUA%$onWbw_m-KWia&n9iv zi)!9#OJ#^}eg8tE{wSb9(c0D^PS1 z9EBS5*ypSiVRS_G0v?$hyoZOS7hFWlp4qbYkf9Y&{%OzhsIdHskLptn96@k6@^K@U zszd8POehITDK+AyW#JKpnWY;ju#MC$JjB1Y*~(E6N%{p#kO+bVxG3X<34n3fW=k{A zCZt|KP%x^GQ9%mU)KE0{LA=vaZvRQbxSlK~eAkwWo2Z<{j5eS5NVTMe`m%re8%~7K zZLtU&b~YDN%~uA9wPf>x2=PI=MA6_oVe>Ek$s5&&Z=8vvF5EODP4Av(b|dlNgF1O8 zy83W0WRdzjz2iNA~t1piEqlyU&`$yZtqR`6X_PmuP>W+D|8iH;FQ zN{JuU#Tz9mV=4R_IewROL1|mK^`lLat#LcIBfggzM(iO$pQT*-c_ z94^LUWw#5B9~sp2W1p`c)Y(xfR<{O^9n4E6vDDw{#-R4UMBKo{>Hqlqn*a9rl_>+0 zS5MwJC~nCC`1X%VCyWFsiDX;bfAJQAUkU#105f_s5U-8rqO}n8fA1{b>Fr6Q|Ea(V z5B11Lo^ooWF?`^{-U#?iatokWI-e$632frzY?Yzzx(xJc@LFM4A~-eg!u|tl{)8Nx ztZLXsSC*68g%9TFu(f&J9nmc^9hgyy#uUOMJFCaifSaDcyQ&6=8e9=t zIFEAQ{EK{|73{($!a4=!wj4ABcQrUQp#+gGM?wEUp(w@+Fzi{!lt}|3`PM%&d-seeR zB$}BrFGD3R10CE>Hsb>;PrP}pd` zaY4}6+Wu(`#uAV+E5SV7VIT7ES#b(U0%%DgN1}USJH>)mm;CHPv>}B18&0F~Kj@1= z&^Jyo+z-E)GRT4U*7$8wJO1OibWg0Jw>C$%Ge|=YwV@Y1(4fR>cV#6aGtRoF@I`*w_V4;)V231NzNqb6g@jdpjmjv*<2j02yU$F8ZS$fTvCC`%|Yn#x< zXUnP&b!GLpOY-TY3d?<-Hhxom_LM9`JC9LEX2{t1P-Nj%nG+0Vq)vQwvO^}coPH-> zAo8w#s>Je^Yy*#PlK=XDxpVS~pFe-j#jN-(As&LRewOf(kN-aKF(H+s*{*!0xrlZw zchJu@XAvQWX7DI1E8?F}Wc8m46eT+C<0eXVB+Z^(g=Kl@FG-cn@u$suj)1V2(KNg_ zh29ws6&6(q~+sOAoHY^o86A<#n*?Pg2)cK$+y;cY$hJLq4)4V84=j+3ShSr##Tk5kgmxB zkW+8A1GtceEx~^Ebhwm36U?oA)h)!mt=eg0QE$D1QsLNZ_T3NH?=B&0j~#298!6iv zhc0|-{46*3`Rx&nKSXnf1&w-Rs>#PGAGuY@cBTU-j|Fxbn3z49S#6KBaP^Lx*AOXxIibr z!1ysMi(&kr!1wwQB5w`BDH2~>T4bI`T1}A2RM0zd7ikC&kuBRsB`Z2@J!Udm{AmSN zrr0k6_qCZL**=)xRW`MFu(OY=OT;3G8eF~ z2mmkXZ9X(sjuKmq+_<=LSjphB$~R1o^Yb=rO!j!(4ErIox^x55o{pXSE9X$!76^*$ zoKhlAX6y%n^U=C~@!vIlEgXQGD@>oOU=_(aXF-Sjas*$AKESfRzxQ8#3yOj|y0OCU z>6Z-0%LCcjla&7I+CXm&caKp@@jQ!5M`(_{CL=@4#JJ}cHeZw>^b6fpv269LSV?gV5Q{kk?4;;y9RIsy5vk%DIRiL(9xe1aA@4!VX zDh2}xgUd5X?6nji%&7-%QuyKSYA-Z{PwJijUQ}In+EJl|x@dF1P<5bPa5W3&&?^h$ zZCo8LepKo0a(Fsln*cHL;D(gu9MMkoiM0*n31u)jHqX5x^F95tnI&^}^yKx3YwEm@ zo8?EZ710ykx@19{=yz5IXb8w4yjdveWb{IVL6Z(Cs>!a_0X^1E27o!4e&b43+J*u2Gb(59k2uK0goLwhO{ujLS ziI9LA9`&x~Y$6JNX!aEXR``}LUI}Gr#=<^wBHmg%v<)zRWDVtq)kT$-P7iU1R)2XZ zi~bYhV@EZ`@prgK(cs{>2jn$pxg$<|KjJ7%26Km>%KcXh^bU@y@V_Lf@=j1x%R4{v zOcQn{I}!2W<~08FOVnoV>zOTH=+>v9!jFo|q)ucqIe!N4{U5_G`>>*sVD{8I~4FqyU8imZ**-Gy`~Xd z4w35GMf%7^i65HdX{Iz|f2Kg193#KhPIeR)-=eYx3Z!%RM=JjwLrdk^B#6rg!ym2w zPbFqYyO4>W_Z6PonAwiu7?!h=x%sR-T+_*xZOGh2wWhWr%}%2^$$ zQvACIB~pi=m|`hXIMvoq`TOCx=J_D2>pi6$NPy3&8#vy|oX)=kM0Z}$BR$r0G}MzOk-OqG+VmZtOZoj6x4(tLh|5h) zBv64Y{DPHsy&_H(5_l(&Y}FhVvr9m_*_Q~Zy-}V9+VmGnvndEjYW4qt4K~N&Y&6g| zfpz*V=A#^mVmuOAz)(KVI<%v5NY0%Goy!{9&o41upsPWk(yFuRP|A4q6NMnX%V~MT zi_Rb-Bno2kI+j0Cw`@ydy{e%ARS#Z%b6I%_yfo_ZKXr4BLVoHzBKJ^ZG z-2>2IzU)55@9C|?_P$ew^-7zEiAKG1XAi{!3h%1m#9s%^pGy6S9wKFYY4<$djeoJP z{GI}Vd%idY$4_fh(7NXm7#;cC!DS&-{tGr!Qze{^%bUx2jgG@-kMta^q-EwrKB}d8 z{%FT>rFk_bzW<{lc%eYlrsiYTZXGgzD1&lmRyp+c1O=0=zAX=KV62bx-a~JP{cPF4 zU$-XT#(9&T>l@bMu3nSr{)%-5lV+0t&bxip4DVJ~vlL$J2P6X~ zd{FS8vm{Lhrieul*7&(AgPuXhjpGila%6_?-+k#b)cdk#M1jB*nE>G6NGOr+Ek{`= z9b%S1`$`=g0CC$>0$Db;l_szReLYVmce*(()9%Zz1`*fNXhI*oRlerWHarD(v^W^c zuc1Vuw6Gbp7ZsoRH>QGt#&lv;5G~Ovt$%7VFd*-rN2>UjbOWBFGNGO`bru7CFB4tn zL`^?69Lj_g_TA&`9`dSI8s|)K|QM0 zybvV7!>xDY|6c6y;Q}qs`){1+WQu_5Dgd8Qe|q}}bxjH+joQQtqs1IVZn6{e7T{ia zF|=^xa%eWO%(x<7j*QZbcU_;aVaVP!arexOLOtoSNt*hvsRL%}%)jPetSich(`b-^ zMZ$PM9%s@%*jPVz0Z^W*cK_>G4f}+eEVX`HOaHg#!B`<4v;x}zDLMR*M27`kNfp!! zOfdt(>k-g>7jf^{Se@3$8<+;R*cYtw+wD_Z8Pl~!JDCUEPq{Ea*!J9`%ihyNJZ30i zmfve}S5<$Uso}_?SuI$ks|{-ddGLu9WR9`^9)Kdi@Vs;x#SY-xp}wHPU0|vEA7234 z@BN1z7OF=OOQtPF$4twn3!HTVlUVD_)ubMM7PEPoiC6lQgL2q9PK4~e8v-OuH%lie z?NgBLkIdPMG$QBq(>r^AOHB`|*1#*!2Z? zuU8H|FD`OBRu^(R?Z-Vhr0j;FLpS~a34KREnd}B=EYHS*>Hm+f%tgJt!4J8Q`qn^4 z9F=tO#JRJ}tzA`vx$nZ)O%wC?Uiv0+_nz}5Lj4ki*&=K&*#U`=rv z`Q@Q{+IhAj@6lrNK2B=8Yln!O2%zomfRehFT~;!O@(@Xy|1Jlw*uOB-M$#6K^)QBm z_7%#QVUDPwnW{iOV-grMQQU|3{=BQMh}c5(yMGdoQf*)k9-B zMQ(^GdJh+y)>qJprknS!%WxqM>HlHOP#7UVdy>%PW$!l72J`n-p7j(DBKoGxXWh(Y z>BFDZl|7knU_jg_SSbvFk8)39%2)Hu5W0}HKlh>EaqvFoXI&56Yy)3) zQkE4X^P0QnPn?iUUVHJZXzPp`s5uv?pG{K9IgGoHvcmlBxubi|iF7n{)mhenIcxGs zgr0OpQy#Y#u=5lOyiECfE_Sn?Fj1LyoRKcbTgX{p<T*v!CGkPc)pcA2D=4Ekp0Gb*wpy7S88C%Ywsbr?MI(3UdsCM?XJ1X%*hNjB)XqZ*W(qDdtSb z<3XN74ARXL3=c^bfW~F%NM^5*Zx92>Wq`&M625p~j$8mYwLbk%Kf)jbn#<2z$%vP5 zy#b>-tF-S2_AB4;R^K&^-1LJrUmi@9rB^FLF)-k&YHK8P+k@RCJ1qSTZ@=kHxA3l$ zmK_ZG)l6(nmCR1a8|;QF-B5e_ELnjJ1$m-;4UXX?WytF_wz7#&AjwZYTMVieLbq@R z3t-q|G4^BB#EpNu4uyfDebB+-uu_$9>y-dzB30Y9F=R zrW-Heqnj*InPTWHgR9v^R7~hokldh&h8=HDhMW(EFfim1*{)5Lc1-+eBVkK-2!u=N zuZKABgJs3I--NbjE;>Undg6uK`^U>AQ6V zhc!RhYgvrmeGNsftr+(C<_MtuV$`5RZTf#5r=DR?gWG->#})#=(td%C3`oO+2B7im zUqY}&a_QNTn?s+?=mNXiREN%x_=(H)L|DtYPY>SR3pQfBOel7G_jR_{!9`dSj8Up-`JgcB;=Oor)U=_EVjF3C5{Sqh8cq=~bRjoBpoc$kJCgtTyZGSpQ4= zYi$6b$-dGmuTDF&@amhV?cU05g(AZV&v2$4m&j_~GZk;&keSO(@LRESRZ&p`dV*6w z2$em~p*8yM6j;SYorw`M5K2mluJq7P5Yn$VtZj8DEs2Zk=O@4T&Q}>~f31Z{uk}`E z{Dp{KObh1kk~~MfLUod72{Pk6G@T$_0_N??lOrdR=Z;VV#m0l)&@hz{Z?)@sgImi-&i1@95g53rON83v!yVPDHRU*Mzc4yZ(-Fr z{8{WXmIJf7jeswk$;6s~Qac6QyM3W&`}m#gRt=rr95A+Ad&wSAgvXZ|F))rBJVJ5W1CsjN`QaOzct2ocq#0!v zmj#075)C!3oS>&N;aHS@<+c>RHL)8j^p)k(8#7$LEx!1g_1^02!4_qA=;uhKW=+ix zGX%+vBMiRiF^^jm{mdO(?GdWJ#unO#_F^7mhT8)s(z_WlwFyJ#Xh)k5+RG2f;LC*K**1dr`#}~6A=0B=I&V;%zDA1)d@G!X#Rng)7G*2k8Kg447r0ox> z5NK`d(H-afBwo9feDOUi>;BbPsu!2|=@g=3j*PY}@YrOb+SX6?#Yb2xaaK!?>SX1J z_!VsB`2n1=wwSftkydm!39|-1?c%Epx?TO<(#GO~I&{f4+)XwRk<7RQ1~5>QcKH|D z?!}j1ueO0Lk;FZ{k4FA_(S`Ot0w~tl&m0duID*f6RY#bkw||o;kZ# zISYNTb|{~|X$m$Q-Jv#uxyw)eM0gIv`V#wOAp&Vv@>X4_tSZ&L#juM@$S9 zx_X_tLh<_^-F;LAQ09s@sPb%PMTrcw*HUV0P=RYSlM&AXEOI&&R&YCm_S<7DRBx^L zA^R^iwW+LMk(r*$Pq-fKU5X@=mQ=`ErO30H@@&qqnI7zJcrbSh+H<V ze&7Uli0xj@WrW#&-9%*FP~kPYF_YYM_hs5~|ExMynQ%qvq`leRB6W0yhC@pCb8>_P zlf=F~WMv_u*-DV=UaVu#2rlzK{q8D95VwZrfV?gj@rSNWXFvktUq)V5+YrlxwX302ae(;aG4e>L-M@3J+-f3IT{b9l!kg*2M zC1+ND9}6m^()LE87Mt+^Q|)!y#suc&v26C=0W88%a{?)E8Yvo@kM&KNMaOst#|-_CbUTm}WS@-c>nRb;&z^ zYr)+IE$1=jov(CZ%3uR+`~NI>1&Gs6W(jaamjcN$a`2!*nO}l|b%?)Q%%UWzw>A`C zR@px(P*7j$TK?jbv*%x)e^|jcLsv}aF(Z0=7(%Oa7+1wY>{B>d+i&ZA$}k(qgZPZY z;VkW~8eWnU&HPIAbco?&tc2O1$6=7n{u|^Y*nXoac{o1W-6aXfy~KlNbJfLoq~6;+ zDYmnv--Fhqrl+UV#k@_(1=gWNtqhyVKN=9CZ-{Ohi>e=~bm4IKbhM%%W zW8oXE!rGpV7Wt(_^4nndH1_imheaWzDi|I})9ZVZ9>pN+P%dVc5wG`Ze*4`@rjn1^ z`ln(;vPBHQUb}y8S>=8q__r7g+=z$>!pReVB0@XKchAvyGjLQs-u>+w%`frV4FeIG zj=7n~hGrwx*&5aHy(7X$bDZ7YhcP%(*>G^lAYMK;qG~V8Jz@b7oNg;IA1z$9@TbzW z;@I51@Ekef#qbxnG$Y8Z%bm~ibZ=4#%yKr%#b)CDrfKN`ujIY?tA4h9)i~dZ4E;ZM znvb$n2)zn$Wx&zlW%mJZDh28ox$@%`w3i7YFepXUChw}$UXKI=-TM51`M#FH=tdr*mQ!c=aB1296Lu>iTTKZWss0f z5~ihdImPN$aTle_AdbYC^31}_^EK|9R&l#%3hbx;8vJ+Gp^tm{9JDILu*1PW!rh^Dn9p<)h#Sl4kKM%nm<+!ESSk* zC;lLNT$fgr-!+{aBsSx$41b}yy6o>r3F#1&iv3cfY2N<+`0qJ+>=&Qxs}JOEkD?^l-F5i`t5+zNuvJf z3Fh4$mNqiFXL-aq4U4K@Ae$fq-TDT`rvrx;gqx96w^*@s=mcthCaIyPe(w)6kI{EqV10tcShHU9eeAPs)s?6#vrq}>y3FeTJu$Udha+z zs7}rmA@yR(L&>35sNjQqrw}o^)UitMU!5g6nnG)(tgst!^`FKJEzI1(d@j_w@;^hr zgYxlIRYjho4U$bhczfq&YySCqCE(5_d>l(4tk1v9!V7PB%Vx{QO=G2NC@c1%3rEzw zN<6i?h;CJX>h)kn49Sr)g#Em6km6ESP`1qc5C3ZHizN>r>V-fSS=X1nT{+Thh@kC! z(H=PlqDt7V6gOYezXUK-dretz!1?IUD6&eL2b!4=9h+HUO&DYZKMM>|YhlEEg?q?S z^XT4$2Fd|zT=x3U#L1|F;-#`to-Y6hiYkWdO=rRC)meY72pIfl`3zEGDU8($iWR^K zI$nq80aSJII<;#W5Pj>^_T&013BJ*O89Uoq z5>;Paa^E}xar^r=!pexg&OTM8wluk4R~Ru=)Hgk`Y#i_$jk{jc8hx}?(dW*X!l4vs z6_%$s#duJJFmaFc-5#>v6Yea=I~)s_pXGS>Tkz?s+WS}>Qp<9MappMLXpkXpSM~SmH6u)`Z5>o02kJs;w@KhdiZ3}29y*xr|6tMo zBHzGic+b+dTd!xOJ;p{Rguh^corJ;K?R6daayQKm+0rf7|AXg0qs!R9eS7t4{G=fs z1$=?kK1Ih=gEkI>@jgXDWHZt*C7FUEWs|u^pE3Z``^K|1KEC^sbN*4nQUfRc_AyE0 zn)?RrGjgPkzfE~_s!rDB!fDsV+*|kEX4+DyS#8%!cshn;s8svwBXSsDGX2ZRa0={* z=`p1F{zD17*Rk>Uk_cw3t5j=9-d6$}MoM~z{v{t^M!g75-+o8_XkP@CZWUQ2z!^26 zCNOu~hgrrK)y>bgqb{`Q_1^zrG4;cGarP!nb4E~(ZKWc`LVeEq;IewVneLp^ZU2+% z95PgN*M5v7Q;ZlGvM#`&u2NdHm%&gZ{bZM5wBCp&?HeZhwU87wyT_z!n4z+1?=RvXZ^72d*%+R1s1$KbAFtR|= zw;MEq=O7pMIKpFwKH6$OOszJAf<_Z<1)36cB>D>|Z6$gJL~jH`n3MMou$#Si%rDAu z4pSkJspG|^CJ86vg6kkfXsA_`8@8iOryOe!Qhn8SV6}mPlof3=WJRVqAr_b;e->`Z zMR(p|K|$L0^6;u~USxg#B6-ZNc%E1dv*^P=|2k*^NOBni#G%9Y?##{=)8KZwh85OL zSBG9|gb|hdmY^gn(ziY&O5#@I?W)W;361Yb^VQNpz0A7&^(7HRAsUvw#)fvhocvja zLxV65J0_$>&cVRctJFsn^qLos^tG`+B0_gQ{NeOwKt-!C^gGFufdtPT*Vi>l#X1|V z2XxsAcixN)Ekq=a##_^=k_^BFH5_zpvPDRP>u6+3$}i&b zy0@FdzAHw?i9OqnlTts_w5D@Nd#eM)KKEuN#m{|AJyscxa}(eA?z4&4yvXo{OBS65 z-?gW;<+;+ntM}U_yTmHm6*2zj0Imj<&ZgE9Wj|gfsXhrVH-c0p$7HXnR8bxDYOi z=_r3FA~u`L&2;Vir8}P3)k|@c?sK1U@&iWo{HEXcoy>6wQSuJ+b4l%aTBuigs&k@Y<2c=S3Ef?p zH>ki4yDuXdo_eu>X1{E$g(Q-u#zVXN^&%70guoizo7x(kQ0OZ}H$O9UB}(FaX8Ct1 zFpx~}EbHf2r6V;x=@8GH$C2|6*?K~?LrtMYd^bw*WYXhA z_))@RMH;nZedW3+qfWbv<|_#BYOxX^rhbN+!za)|!|8K*LRs(R$O*2SDM{g9k7e{u zN4VIdi}e#0&h?sBxu$>Yy%)j(k1V2fuhp8r!}gfF@b;F?U`6}YnnMh1&sSU&lR^?# zu!61+lGsuFEfDraX3+$QZibCbKzc{75G^T7@WZSQ)j5898G1AOXB*H*TSd`f<`IK# zm1%&t?i|2Z-a&r!pJehzg@!awNp)R)aa?q_SqGrxE5u+T#f?K2;GAHV?O&>!W@Q*k)7=g2vDW+7K zbyY9i{|nOF*SbMYoRQSAbSH2y$bE5(@d6xKxcF#@TE~X#3o=;`0sc!RupdRmQsML? z&>SCwS{FOpSr+@6Uuz3m`hj}(^g`Jz|6?({!%WVJn$H|ugxW+x-GEA?J&U^ugj3Nb z;65~)W<}iH2PJ@st8LtLfSOLXYgj=9<;?ih7rq$bXW9J#!B8!Wu6#U`A$wlcoC*&` z_9Js~7%m79#+edeT&P`@_Ng@e&5J+pqpx%31tAF71)pcz~-yJ>P5yX(nuM4;bUHDa8E(~~l{j~JeCGkX>nHJDpgSf&bTHEf)qw8{Q~CBPEVen|MW2P3vmf`8X9-g|>>ddp zcgfjbl~(?3Wa*NzQH>4nsM$3}Ul>pX1xC0oF3TZXe7=V!9!n?WgvH|R zpbruczmB%z=zkZ>=1R|gXwGThLELqD5KCUhtiRGT*JwKIvzbzV%ZU!e!VcNHSSX3> zObH|oohc8nvQZ2}q??C}@>!fe3gH+HF@4(qWqi>;ag~md#D;cl8&gQb^?2a@5cikT z=7r78@&5gV3Ggc9f=<<8v~yz`NcEGvbX1V_`IL(&+Z>LB zM~$ok2qXzod@1$TEl*U~H$V5g$er{Uj^($sWb7Nr{gsIbE(`$LRGECTOraXiU%=uq z0zvpi1S%)RxTjzoVcR4#10)fs()4Mtsa@e?9j)Bk!LsYyXIZga2q7d%`vQE!V@<1Y zmkpH3LeXJNO9f7l>F84g;huc=4nk(UnU}RLZmYk2TtB#lv34K(?8~gyx-mN%g=U44 zOPdr_!j-;IEbe|l9-buuKEy^Q9MLjSKG$S6dz)!U_32{1)N}L)3+COmlg=nY1@od$ zJ<0z-B%sisAR1yh>z-RfQQb6M4i-d#vxvb~f69M{JLPZv1JSCh1$gQ*LxOF-tH9!k zbQ0ZW)S7)qCSF|=2`q_A3}OHBNBueZwTTz^ar~gz#2KA74&&D)KHt~m4F_nK<^*7_ z!!pN@xiGkq%>1N(rNxw$zu-=1t*IpAy$ z4~dD0w%9;E?(greVWZ3(o9ux`elM>Rek#0 zO=#-(4p5B+wFzlEU7^k{3EdL6sIp|K*>xrriI`}E8ze|z-$YpN`^_teL_7P`%e>IN z7tNiH619P+0Q1hBR|W#POOta)1|LkIRtgz zMJ9VOxXN#o)mlXS=u%`Q>~PBuKEmOWsIuQRp{y%!ty{fEyL0gV)$LQeL#pqX3L@SR zJ2Gb^E9+KVd?;joVOXlGie3?z6>(>u(i!(qGz(W( ze~^xj&IRF<98ypEis{Y_FoHn%C0bW(XeF#Lj=2WUEBqKNPPFppEH?_a3}-h906X}C zSYKcZFU`Om5YlWhh@ogzCn3NvuM~F9jOX|xe-X*!YL+#ceh_tJoHXz`aTnvSrOAZ| zOtdGz?QdT!oAJr3(XL2G(p%2X4{xEohU&vd_zQ(U%ihHOlKPWnb$&YYhx48?|R++>`5?sxvM?!;ru|9 zZ#nwuTK^S%ce<+ggdJBE&fRrXN7O!{nu`%q`M{2Ef_+IRad2cf01P9pST9AOK>y75c!9}~)Et^6$`&Nm{wzWcm4c0j9DF!xJTpGrMp3esI4D_iiDe`sswXSu{dQZE_`^A11 z?Z@Hw=65mVu^%X`>;$mciK}XiZ{xw7I_!t)S00^JuxdCXhIRO~S*lPS(S^je`DH4E zxbKNs8RL`N?gCQ@YSOU=>0FE#Ku#DRO7JA&fu-X8b;3!^#{=7`WsDXUxfUsE(FKSQ z&=N`A7IwLq%+vt(F;z+T=uZNl=@K4|E%p{p^o5(BGjsE|WOR`%8+XgGW8xJTFJc4L zVY#L`OdnSM{HyS$fX1)3_JuNNH1aDsDqi>CzCT5=kY5zV<~29bX)c^I8R5n&ymHkx zj(QC4t#mDK;2xi8O%V;C{HqDQeM64=b4@sa*N_K0a&ro4+8LY6cFHz< ze|!g}zF|tDrP=`+U7KwKl20gdW1%!iN>1=uxA|NZJ2peruBOj?RBPb~8G;s6xIi6- z?_odhafsxoxiBf zwZZ)c*)FLc0#wE~bXw0TPBYl+h9hs|DYr_B4LR_YL@S1hQs=p zNEh%_fUvWZCbJtaF#kP5=(O#{8|g&Kmz1&8{@Lufw^DhtvKx955~aqxi2C=)Z-!Kd z+m-u+#^U4(HYn6a1w652kO0bYBt&goyx(n?MR^kI+{Q?0Y{G~W2) z0dS3fuJ?SU(6ZDp=kUley%PK}K_;YQyK|U|?7t9SHiyIfpT4a_kUVIhH4PSaj@3mo z`z}|mHhx1Pq?@(3vTBb5HTXuFAzFZEt0D-fw_kd=XvwIUh3VXTm{wbDA~cESd5cI1 zd>6=&AvG3yu+)`9oxmfrDQ(1fzv(_0l?bp{a364dXLRRBI8kBv!KsL;brY)#E3`o{ z3TlWUsS0{Voci?6MejccG9x_KiqN>So*1{25r6BSl9jUyR}1TgXBLL7Pr6Wv~Nu47;fbiU7TbL}>qmtl36YSZ() zVf@nqW(As~#`@bIC+AxSw!O5Pocf&rYaCFm?Jd?XR)p#@{!|5^Ws@wd855)mI^8y{ zws+VvGXW6%xoj@JkGb=~%oJ~7m6+uhOv?bH+jJJ~eFgp+}~*^C+3>R-MY!IZQoabCh( zN(T+z@Oyc^C)WqQESmh{d!!T8zS(!wX=R#hEKxMXy(eg zZ+Cwm1a%?;RH$h2_ws|nRjn8ZY!>3gn+6Ep4xT|AeFox7!rac2Lw?jsz}JqPE?5JG zok0}q1P;cuzs%Yrze|&d$oTr<`Lx{fbq2OV=!3v-ODq(n?|WxuhtmwJBIoW^^FB+D z-?Ok9HBKc5@)L(W&vmI{prL?4^OE9TR)bELS=<>*w%&aKjzi*@;5#P3moG@dm{Eke zhE#Is;&=o|{2GWai}7LYEI+gmc^Kj4K7w7n)+9godg?yB2?xs}pF1<*!Sv?D~Uvbkgs9xx9s#6zBv9l@ox>d#H6eqw^KZO;Vg}h!q zI33^$4}yF*q+q{DsJsa(SsV!YQ#zi^IF9MQV6i{SiN4dWWCi%YQ+hNc1r!^+<(YnB zG62-D`M3w3Q2;@X{S`n`{QO>migDpz0FK`->sYDOESs6u>-~<}_XN_6><2g7U#XC{ z$#Ig;n{_yEMnlvx-lP*;ts#DHV0r8j518>~33?Ak#jocW>uk>6V||p7{4rov#RS9c zdPD6r`qF1om9r!zS4Jk1>7fn#GCnmD=JIt1Na`X)=*LP7R!3XATgk`;&U*P<(0d z9p<0T&eYqQ9jot39FxpfuPSPYlfQ$s-*;+c1KL+cHIVcG5`H~^Ryu1Hk7%Nf$TCwR!SzG31@NHpm`mcp8v!wyWM49TjTxASJ-8JP*MTHLC}hF==PUOh8kaaXeGFGd<|e29vSDaS ztPeu&zv0^wN}Hahi`$pcDs~FVt2F;K!q}q*Y@{7i#stWfU`u2La4aerBKhV`^zG~j zJWvtZpcHIP7x*tfLSQcng6D(`HVp4=LWp_0Xt=2wEHjK)!DSz_Z?5J@>awRyk?azj zU-kdSs~cp))*pfJ_q7u`IsCq8F|OShB~D56S(Mwwlt?{yURE7#eI&WcpVq(@9Fd~g zeUiD!a4w51Nj(YzLnau+O3MDub|?loF0=<#jLztAM>PruE7yNDD0L}y=Ayuc?^?Ni zf~%GK=iEhn2}xKp7GonJx!JpDmDsco$|$XtRdUDwbM9$9s7x9-of2nKNj~?b@UOKz z9{`=Irz^ba-c&1vSQxSh;I2`cKc8-4)aCy%#bam;3_8vSJ-jw`_}lyukEC~z00EbC zI*dU3F21A)dSZr{qA5QF+{a%D`h#?8o%M?)*hWxuqnQD(TpcmfNq&UN$BmB)0!r8) zxno@Q?$_D&*4(rW6b+?-Y^5|*P`DHmJ%pI<6*yP)o}2^?>d7P#bd2j=vvx2mfLW@R zQLD`%buR*}nzNYNf%68w-D$7%v|=bXg1mYrdZy~}(@RRZ-U+Gx=nmCjVxr5Ag# zLw3R29-MHJl|`mRxj#sv@EfyR#-q>BE-XFEENbV$#dWM?!VjU8~kKZsd@G=HPrI{HiqN&j<92*-3$^M*;n@rG*i! zvi#?j;lc5w>@+r!6*CVUrN9as=S3?(ZBT979$5R#ZpPm?2VjIyQcEFp9orGR>f;G? zK<~FiYY6ow-&}|v7k?+03TC++so$)2~rN``u z>N%j$AbNQLX_!evzG8abf=15260vIXdz7K^a$YS)iw{@x5<|Rr#ii|ov=LJ{eu>dZYe_ip$ZuzvRu1dpjQK1BvP zH~m#t=2_wy>9+YkdNF-z` zQ*#7=^r%R*pIi2AI`>n9>(QJVE1k8?Ilav<)NUjW^O$}^yZZ{_Uwn!4Fq1`aslX;Y zj`XDIm`E1sz|wShA=?a@ZGKDSMU#Z3$E!1nZ)g^Eg3ZDoSN6@RXrGVCHvMIauS7d> zuJltXf9)LdTWdF!n%-iA9b#2$W#i??K)zYho^((ZqluvhAr@{H{diy0%@-~VW zKYC|2Ma)2^=skdLT@ZVqJfiCDqS@~qIGexL(BKy6Aw9ch0hoHN&E+m3*uka9+AIh3gTWdSe~W({-&^oFw`!j7$DcsF$7`pO?kRMK<9h=SV?cmyJIe`$4|zoI(6u9#qY9zM?#zNe^!Dl2>Z^dH`>`wSY# ztU;V*+g0R0DH6EnJA$U{QL&T~&s{`smeC2I-5mzv=v$l@iF;yN0hMibU=CG^e>J;+9k`Si9PzLaj$>}QKI6lWmO_o+_( zmhxA*0|-Na`+*J1qEMIXZf9rb#;pcOw>EDeDjb!|GumQ2!1ac;YqU|X;F@l1_lemzTN0J|U zFJF(kO21aHg)*KfuKT=BA{VDkOvlx(b{f|A9D69_BHUm#S$F>~`Mt@GesjLp3;reY zP~q>6Tt;`XkjqV?i7lqPbWGh`y<7dq<}pDHl-dDA4QG6`QDq)+vq_&HfW!}P6Cp4d zt>Qnli5ri*I1ILEOGD~3Y!@2^Jmcy1xDXmKolC?at}_6;neEfca0rLHT}NLpoUYh` zDbCtfZnYN&>}m-(F{5d1=)bBuZ?OcP`GmsQV@kn%JMJUIep`Avon#8=ATpEo-@hg& z12f-)R=HCD%pUjvbWa|P!}u)=wInpZG*LHKrZDMeC>Qils^IyY)x;kDRs4c3!DDOG zAptSsf#1X>kSli|Qka@S)6O4un-2aKL?bcV;$*>KSxHovjrfZ^-+c#>;(42yj71K| zzRyFiLrwv$rPcNA{mtv=o(*JDA0kS93>OE0D{KMJzLk$cc_5dCLWnJcFJd6_>BpE< z?aW9;^!;arQcIjloW&YL+~MkNO&a>N=pmhg>{SM<@`a&VeUA`ay*P@R$_+WS2%r?_ zs&Z%c`>ie+%!I=Lz>$9$7a`-`hoc&*dl60^whsaQ;~9~@JYn1Oc_bmgVVyAzUOYgZ z#j{`#D_YZ)(wa5;qzR#zo4a|-ANJjBB90r4Iun3*BkMxw_Ti>SjhktsmR|BPCLt>9 zZ_3eQjweI*-8+HNt)$9^s|+10w@sU!PY{`#BnF!ULS=#{k0Zr5`yOS?p8PfWbKT`6 z@T+PeRJ4`fj5t8bMs)0>o9|C>mBTlfQ*nFG#Rri-Q7}E}+eaz`LmO!`Y_pHkoAruu z`&!5VNnA3IG$}Pz)V&pt&AF!$E{J-;or3vWv3&Sl&9KzG+ae73Zf}=aP*SCI1{?0T z9SAC)W(?DSKOkcmW$(K5Bl?c@(5#>J#j@eq#ctX~$TIjkl>Wrfv%Ey+bl1Z-v?NxJ zwZ9!ae-MsHPUx&_W22?9$mCE%&~lzVG?hDXM%~gXGk+Q!Jf0BspkMWxy;^!n<6JIrSYjv z6F%~$8)0^qbUho9Sdf97b_n({$;|XH9-RHrohHuPcro@03KEPFejN&q?&nJFoIQY; zSI#uL6>2^^yOR!51OLO65xGas55dPG;3=uQ35ZYW04#+~byXQf^7Vq`G z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Info.plist b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart b/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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:example/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/14-automated-testing/projects/final/packages/component_library/example/windows/.gitignore b/14-automated-testing/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/CMakeLists.txt b/14-automated-testing/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/Runner.rc b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/main.cpp b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/resource.h b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.cpp b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.h b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/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/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.h b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/14-automated-testing/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata index be0f63d8..e27f5ccf 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/.metadata @@ -1,10 +1,45 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled and should not be manually edited. +# This file should be version controlled. version: - revision: 4cc385b4b84ac2f816d939a49ea1f328c4e0b48e + revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 channel: stable project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/main.cc b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.cc b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Info.plist b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Release.entitlements b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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:example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/.gitignore b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/Runner.rc b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/main.cpp b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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.CreateAndShow(L"example", 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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/resource.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/resources/app_icon.ico b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.cpp b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.cpp b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.h b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ From ce4404bc508ffd6bb2902a19a67a472f827135c0 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:19:55 +0200 Subject: [PATCH 10/30] Updating 12 starter project --- .../projects/starter/.gitmodules | 4 - .../projects/starter/.metadata | 10 - .../projects/starter/android/app/build.gradle | 2 +- .../projects/starter/android/build.gradle | 2 +- .../starter/integration_test/app_test.dart | 24 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/starter/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 114 ++-- .../projects/starter/ios/Runner/Info.plist | 17 +- .../starter/ios/Runner/Runner.entitlements | 10 + .../starter/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../projects/starter/lib/l10n/messages_pt.arb | 4 + .../projects/starter/lib/main.dart | 54 +- .../projects/starter/lib/routes.dart | 179 ------ .../projects/starter/lib/routing_table.dart | 174 ++++++ ..._screen.dart => tab_container_screen.dart} | 4 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../example/test/widget_test.dart | 30 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 ++++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 ++ .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.yaml | 2 +- .../favorite_icon_button_widget_test.dart | 46 ++ .../component_library/test/widget_test.dart | 15 - .../packages/domain_models/pubspec.yaml | 2 +- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../starter/packages/fav_qs_api/pubspec.yaml | 9 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.yaml | 2 +- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 ++ .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.yaml | 2 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 ---- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 4 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 ++ .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 ++- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.yaml | 7 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 ++ .../packages/features/sign_in/pubspec.yaml | 5 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../packages/features/sign_up/pubspec.yaml | 2 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../features/update_profile/pubspec.yaml | 2 +- .../starter/packages/form_fields/pubspec.yaml | 2 +- .../packages/key_value_storage/pubspec.yaml | 2 +- .../lib/src/dynamic_link_service.dart | 65 +- .../starter/packages/monitoring/pubspec.yaml | 12 +- .../packages/quote_repository/pubspec.yaml | 2 +- .../packages/user_repository/pubspec.yaml | 7 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 ++ .../test/user_repository_test.mocks.dart | 53 ++ .../projects/starter/pubspec.lock | 199 +++--- .../projects/starter/pubspec.yaml | 6 +- .../projects/starter/test/example_test.dart | 17 + .../projects/starter/test/widget_test.dart | 15 - 226 files changed, 6089 insertions(+), 899 deletions(-) delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/.gitmodules delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/.metadata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/integration_test/app_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Runner.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/messages_pt.arb delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routes.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routing_table.dart rename 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/{home_screen.dart => tab_container_screen.dart} (92%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.metadata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/README.md create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/analysis_options.yaml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/build.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/build.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle.properties create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/settings.gradle create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/main.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/stories.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/story_app.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/pubspec.yaml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/favicon.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/index.html create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/manifest.json create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/widget_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/common_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/l10n.yaml delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/widget_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/common_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/example_test.dart delete mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/widget_test.dart diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.gitmodules b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.metadata b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle index 9933bb19..7d93d0b6 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle @@ -24,7 +24,7 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' -// TODO: apply Firebase Crashlytics plugin +apply plugin: 'com.google.firebase.crashlytics' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle index 2cd9da42..a4793051 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle @@ -9,7 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' - // TODO: add Firebase Crashlytics classpath + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/integration_test/app_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Flutter/AppFrameworkInfo.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Flutter/AppFrameworkInfo.plist +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Podfile b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Podfile +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj index 1c807e2a..3053d607 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,14 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, + 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -213,6 +202,40 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; + }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -225,9 +248,9 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -263,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -361,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -434,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -509,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Info.plist index a6b6b1b6..80173535 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Info.plist +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS @@ -43,7 +58,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Runner.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/main.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/main.dart index ed2d10b4..14ca7ac3 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/main.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -18,7 +18,7 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; // TODO: replace the implementation of main() function @@ -69,35 +69,43 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ // TODO: add observers to RoutemasterDelegate ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - remoteValueService: widget.remoteValueService, - dynamicLinkService: _dynamicLinkService, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _navigator.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { - _navigator.push(path); + _routerDelegate.push(path); } } @@ -107,6 +115,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -114,24 +123,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routes.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routes.dart deleted file mode 100644 index 9fca3705..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routes.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - required RemoteValueService remoteValueService, - required DynamicLinkService dynamicLinkService, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - remoteValueService: remoteValueService, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onSignUpTap: () { - navigator.push( - _RoutePaths.signUpPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? '', - ), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '${homePath}sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routing_table.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/home_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/tab_container_screen.dart similarity index 92% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/home_screen.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/home_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/closing-quote.svg b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/closing-quote.svg +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/opening-quote.svg b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/opening-quote.svg +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.metadata b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.metadata new file mode 100644 index 00000000..e27f5ccf --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/.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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/README.md b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/analysis_options.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle.properties b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/settings.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/loader.json b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/component_storybook.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/main.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/stories.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/story_app.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/main.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 zcmaiYXH?Tqu=Xz`p-L#B_gI#0we$cm_HcmYFP$?wjD#BaCN4mzC5#`>w9y6=ThxrYZc0WPXprg zYjB`UsV}0=eUtY$(P6YW}npdd;%9pi?zS3k-nqCob zSX_AQEf|=wYT3r?f!*Yt)ar^;l3Sro{z(7deUBPd2~(SzZ-s@0r&~Km2S?8r##9-< z)2UOSVaHqq6}%sA9Ww;V2LG=PnNAh6mA2iWOuV7T_lRDR z&N8-eN=U)-T|;wo^Wv=34wtV0g}sAAe}`Ph@~!|<;z7*K8(qkX0}o=!(+N*UWrkEja*$_H6mhK1u{P!AC39} z|3+Z(mAOq#XRYS)TLoHv<)d%$$I@+x+2)V{@o~~J-!YUI-Q9%!Ldi4Op&Lw&B>jj* zwAgC#Y>gbIqv!d|J5f!$dbCXoq(l3GR(S>(rtZ~Z*agXMMKN!@mWT_vmCbSd3dUUm z4M&+gz?@^#RRGal%G3dDvj7C5QTb@9+!MG+>0dcjtZEB45c+qx*c?)d<%htn1o!#1 zpIGonh>P1LHu3s)fGFF-qS}AXjW|M*2Xjkh7(~r(lN=o#mBD9?jt74=Rz85I4Nfx_ z7Z)q?!};>IUjMNM6ee2Thq7))a>My?iWFxQ&}WvsFP5LP+iGz+QiYek+K1`bZiTV- zHHYng?ct@Uw5!gquJ(tEv1wTrRR7cemI>aSzLI^$PxW`wL_zt@RSfZ1M3c2sbebM* ze0=;sy^!90gL~YKISz*x;*^~hcCoO&CRD)zjT(A2b_uRue=QXFe5|!cf0z1m!iwv5GUnLw9Dr*Ux z)3Lc!J@Ei;&&yxGpf2kn@2wJ2?t6~obUg;?tBiD#uo$SkFIasu+^~h33W~`r82rSa ztyE;ehFjC2hjpJ-e__EH&z?!~>UBb=&%DS>NT)1O3Isn-!SElBV2!~m6v0$vx^a<@ISutdTk1@?;i z<8w#b-%|a#?e5(n@7>M|v<<0Kpg?BiHYMRe!3Z{wYc2hN{2`6(;q`9BtXIhVq6t~KMH~J0~XtUuT06hL8c1BYZWhN zk4F2I;|za*R{ToHH2L?MfRAm5(i1Ijw;f+0&J}pZ=A0;A4M`|10ZskA!a4VibFKn^ zdVH4OlsFV{R}vFlD~aA4xxSCTTMW@Gws4bFWI@xume%smAnuJ0b91QIF?ZV!%VSRJ zO7FmG!swKO{xuH{DYZ^##gGrXsUwYfD0dxXX3>QmD&`mSi;k)YvEQX?UyfIjQeIm! z0ME3gmQ`qRZ;{qYOWt}$-mW*>D~SPZKOgP)T-Sg%d;cw^#$>3A9I(%#vsTRQe%moT zU`geRJ16l>FV^HKX1GG7fR9AT((jaVb~E|0(c-WYQscVl(z?W!rJp`etF$dBXP|EG z=WXbcZ8mI)WBN>3<@%4eD597FD5nlZajwh8(c$lum>yP)F}=(D5g1-WVZRc)(!E3} z-6jy(x$OZOwE=~{EQS(Tp`yV2&t;KBpG*XWX!yG+>tc4aoxbXi7u@O*8WWFOxUjcq z^uV_|*818$+@_{|d~VOP{NcNi+FpJ9)aA2So<7sB%j`$Prje&auIiTBb{oD7q~3g0 z>QNIwcz(V-y{Ona?L&=JaV5`o71nIsWUMA~HOdCs10H+Irew#Kr(2cn>orG2J!jvP zqcVX0OiF}c<)+5&p}a>_Uuv)L_j}nqnJ5a?RPBNi8k$R~zpZ33AA4=xJ@Z($s3pG9 zkURJY5ZI=cZGRt_;`hs$kE@B0FrRx(6K{`i1^*TY;Vn?|IAv9|NrN*KnJqO|8$e1& zb?OgMV&q5|w7PNlHLHF) zB+AK#?EtCgCvwvZ6*u|TDhJcCO+%I^@Td8CR}+nz;OZ*4Dn?mSi97m*CXXc=};!P`B?}X`F-B5v-%ACa8fo0W++j&ztmqK z;&A)cT4ob9&MxpQU41agyMU8jFq~RzXOAsy>}hBQdFVL%aTn~M>5t9go2j$i9=(rZ zADmVj;Qntcr3NIPPTggpUxL_z#5~C!Gk2Rk^3jSiDqsbpOXf^f&|h^jT4|l2ehPat zb$<*B+x^qO8Po2+DAmrQ$Zqc`1%?gp*mDk>ERf6I|42^tjR6>}4`F_Mo^N(~Spjcg z_uY$}zui*PuDJjrpP0Pd+x^5ds3TG#f?57dFL{auS_W8|G*o}gcnsKYjS6*t8VI<) zcjqTzW(Hk*t-Qhq`Xe+x%}sxXRerScbPGv8hlJ;CnU-!Nl=# zR=iTFf9`EItr9iAlAGi}i&~nJ-&+)Y| zMZigh{LXe)uR+4D_Yb+1?I93mHQ5{pId2Fq%DBr7`?ipi;CT!Q&|EO3gH~7g?8>~l zT@%*5BbetH)~%TrAF1!-!=)`FIS{^EVA4WlXYtEy^|@y@yr!C~gX+cp2;|O4x1_Ol z4fPOE^nj(}KPQasY#U{m)}TZt1C5O}vz`A|1J!-D)bR%^+=J-yJsQXDzFiqb+PT0! zIaDWWU(AfOKlSBMS};3xBN*1F2j1-_=%o($ETm8@oR_NvtMDVIv_k zlnNBiHU&h8425{MCa=`vb2YP5KM7**!{1O>5Khzu+5OVGY;V=Vl+24fOE;tMfujoF z0M``}MNnTg3f%Uy6hZi$#g%PUA_-W>uVCYpE*1j>U8cYP6m(>KAVCmbsDf39Lqv0^ zt}V6FWjOU@AbruB7MH2XqtnwiXS2scgjVMH&aF~AIduh#^aT1>*V>-st8%=Kk*{bL zzbQcK(l2~)*A8gvfX=RPsNnjfkRZ@3DZ*ff5rmx{@iYJV+a@&++}ZW+za2fU>&(4y`6wgMpQGG5Ah(9oGcJ^P(H< zvYn5JE$2B`Z7F6ihy>_49!6}(-)oZ(zryIXt=*a$bpIw^k?>RJ2 zQYr>-D#T`2ZWDU$pM89Cl+C<;J!EzHwn(NNnWpYFqDDZ_*FZ{9KQRcSrl5T>dj+eA zi|okW;6)6LR5zebZJtZ%6Gx8^=2d9>_670!8Qm$wd+?zc4RAfV!ZZ$jV0qrv(D`db zm_T*KGCh3CJGb(*X6nXzh!h9@BZ-NO8py|wG8Qv^N*g?kouH4%QkPU~Vizh-D3<@% zGomx%q42B7B}?MVdv1DFb!axQ73AUxqr!yTyFlp%Z1IAgG49usqaEbI_RnbweR;Xs zpJq7GKL_iqi8Md?f>cR?^0CA+Uk(#mTlGdZbuC*$PrdB$+EGiW**=$A3X&^lM^K2s zzwc3LtEs5|ho z2>U(-GL`}eNgL-nv3h7E<*<>C%O^=mmmX0`jQb6$mP7jUKaY4je&dCG{x$`0=_s$+ zSpgn!8f~ya&U@c%{HyrmiW2&Wzc#Sw@+14sCpTWReYpF9EQ|7vF*g|sqG3hx67g}9 zwUj5QP2Q-(KxovRtL|-62_QsHLD4Mu&qS|iDp%!rs(~ah8FcrGb?Uv^Qub5ZT_kn%I^U2rxo1DDpmN@8uejxik`DK2~IDi1d?%~pR7i#KTS zA78XRx<(RYO0_uKnw~vBKi9zX8VnjZEi?vD?YAw}y+)wIjIVg&5(=%rjx3xQ_vGCy z*&$A+bT#9%ZjI;0w(k$|*x{I1c!ECMus|TEA#QE%#&LxfGvijl7Ih!B2 z6((F_gwkV;+oSKrtr&pX&fKo3s3`TG@ye+k3Ov)<#J|p8?vKh@<$YE@YIU1~@7{f+ zydTna#zv?)6&s=1gqH<-piG>E6XW8ZI7&b@-+Yk0Oan_CW!~Q2R{QvMm8_W1IV8<+ zQTyy=(Wf*qcQubRK)$B;QF}Y>V6d_NM#=-ydM?%EPo$Q+jkf}*UrzR?Nsf?~pzIj$ z<$wN;7c!WDZ(G_7N@YgZ``l;_eAd3+;omNjlpfn;0(B7L)^;;1SsI6Le+c^ULe;O@ zl+Z@OOAr4$a;=I~R0w4jO`*PKBp?3K+uJ+Tu8^%i<_~bU!p%so z^sjol^slR`W@jiqn!M~eClIIl+`A5%lGT{z^mRbpv}~AyO%R*jmG_Wrng{B9TwIuS z0!@fsM~!57K1l0%{yy(#no}roy#r!?0wm~HT!vLDfEBs9x#`9yCKgufm0MjVRfZ=f z4*ZRc2Lgr(P+j2zQE_JzYmP0*;trl7{*N341Cq}%^M^VC3gKG-hY zmPT>ECyrhIoFhnMB^qpdbiuI}pk{qPbK^}0?Rf7^{98+95zNq6!RuV_zAe&nDk0;f zez~oXlE5%ve^TmBEt*x_X#fs(-En$jXr-R4sb$b~`nS=iOy|OVrph(U&cVS!IhmZ~ zKIRA9X%Wp1J=vTvHZ~SDe_JXOe9*fa zgEPf;gD^|qE=dl>Qkx3(80#SE7oxXQ(n4qQ#by{uppSKoDbaq`U+fRqk0BwI>IXV3 zD#K%ASkzd7u>@|pA=)Z>rQr@dLH}*r7r0ng zxa^eME+l*s7{5TNu!+bD{Pp@2)v%g6^>yj{XP&mShhg9GszNu4ITW=XCIUp2Xro&1 zg_D=J3r)6hp$8+94?D$Yn2@Kp-3LDsci)<-H!wCeQt$e9Jk)K86hvV^*Nj-Ea*o;G zsuhRw$H{$o>8qByz1V!(yV{p_0X?Kmy%g#1oSmlHsw;FQ%j9S#}ha zm0Nx09@jmOtP8Q+onN^BAgd8QI^(y!n;-APUpo5WVdmp8!`yKTlF>cqn>ag`4;o>i zl!M0G-(S*fm6VjYy}J}0nX7nJ$h`|b&KuW4d&W5IhbR;-)*9Y0(Jj|@j`$xoPQ=Cl literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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:example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/favicon.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-192.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-512.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 zcmeFZ_gj-)&^4Nb2tlbLMU<{!p(#yjqEe+=0IA_oih%ScH9@5#MNp&}Y#;;(h=A0@ zh7{>lT2MkSQ344eAvrhici!td|HJuyvJm#Y_w1Q9Yu3!26dNlO-oxUDK_C#XnW^Co z5C{VN6#{~B0)K2j7}*1Xq(Nqemv23A-6&=ZpEijkVnSwVGqLv40?n0=p;k3-U5e5+ z+z3>aS`u9DS=!wg8ROu?X4TFoW6CFLL&{GzoVT)ldhLekLM|+j3tIxRd|*5=c{=s&*vfPdBr(Fyj(v@%eQj1Soy7m4^@VRl1~@-PV7y+c!xz$8436WBn$t{=}mEdK#k`aystimGgI{(IBx$!pAwFoE9Y`^t^;> zKAD)C(Dl^s%`?q5$P|fZf8Xymrtu^Pv(7D`rn>Z-w$Ahs!z9!94WNVxrJuXfHAaxg zC6s@|Z1$7R$(!#t%Jb{{s6(Y?NoQXDYq)!}X@jKPhe`{9KQ@sAU8y-5`xt?S9$jKH zoi}6m5PcG*^{kjvt+kwPpyQzVg4o)a>;LK`aaN2x4@itBD3Aq?yWTM20VRn1rrd+2 zKO=P0rMjEGq_UqpMa`~7B|p?xAN1SCoCp}QxAv8O`jLJ5CVh@umR%c%i^)6!o+~`F zaalSTQcl5iwOLC&H)efzd{8(88mo`GI(56T<(&p7>Qd^;R1hn1Y~jN~tApaL8>##U zd65bo8)79CplWxr#z4!6HvLz&N7_5AN#x;kLG?zQ(#p|lj<8VUlKY=Aw!ATqeL-VG z42gA!^cMNPj>(`ZMEbCrnkg*QTsn*u(nQPWI9pA{MQ=IsPTzd7q5E#7+z>Ch=fx$~ z;J|?(5jTo5UWGvsJa(Sx0?S#56+8SD!I^tftyeh_{5_31l6&Hywtn`bbqYDqGZXI( zCG7hBgvksX2ak8+)hB4jnxlO@A32C_RM&g&qDSb~3kM&)@A_j1*oTO@nicGUyv+%^ z=vB)4(q!ykzT==Z)3*3{atJ5}2PV*?Uw+HhN&+RvKvZL3p9E?gHjv{6zM!A|z|UHK z-r6jeLxbGn0D@q5aBzlco|nG2tr}N@m;CJX(4#Cn&p&sLKwzLFx1A5izu?X_X4x8r@K*d~7>t1~ zDW1Mv5O&WOxbzFC`DQ6yNJ(^u9vJdj$fl2dq`!Yba_0^vQHXV)vqv1gssZYzBct!j zHr9>ydtM8wIs}HI4=E}qAkv|BPWzh3^_yLH(|kdb?x56^BlDC)diWyPd*|f!`^12_U>TD^^94OCN0lVv~Sgvs94ecpE^}VY$w`qr_>Ue zTfH~;C<3H<0dS5Rkf_f@1x$Gms}gK#&k()IC0zb^QbR!YLoll)c$Agfi6MKI0dP_L z=Uou&u~~^2onea2%XZ@>`0x^L8CK6=I{ge;|HXMj)-@o~h&O{CuuwBX8pVqjJ*o}5 z#8&oF_p=uSo~8vn?R0!AMWvcbZmsrj{ZswRt(aEdbi~;HeVqIe)-6*1L%5u$Gbs}| zjFh?KL&U(rC2izSGtwP5FnsR@6$-1toz?RvLD^k~h9NfZgzHE7m!!7s6(;)RKo2z} zB$Ci@h({l?arO+vF;s35h=|WpefaOtKVx>l399}EsX@Oe3>>4MPy%h&^3N_`UTAHJ zI$u(|TYC~E4)|JwkWW3F!Tib=NzjHs5ii2uj0^m|Qlh-2VnB#+X~RZ|`SA*}}&8j9IDv?F;(Y^1=Z0?wWz;ikB zewU>MAXDi~O7a~?jx1x=&8GcR-fTp>{2Q`7#BE#N6D@FCp`?ht-<1|y(NArxE_WIu zP+GuG=Qq>SHWtS2M>34xwEw^uvo4|9)4s|Ac=ud?nHQ>ax@LvBqusFcjH0}{T3ZPQ zLO1l<@B_d-(IS682}5KA&qT1+{3jxKolW+1zL4inqBS-D>BohA!K5++41tM@ z@xe<-qz27}LnV#5lk&iC40M||JRmZ*A##K3+!j93eouU8@q-`W0r%7N`V$cR&JV;iX(@cS{#*5Q>~4BEDA)EikLSP@>Oo&Bt1Z~&0d5)COI%3$cLB_M?dK# z{yv2OqW!al-#AEs&QFd;WL5zCcp)JmCKJEdNsJlL9K@MnPegK23?G|O%v`@N{rIRa zi^7a}WBCD77@VQ-z_v{ZdRsWYrYgC$<^gRQwMCi6);%R~uIi31OMS}=gUTE(GKmCI z$zM>mytL{uNN+a&S38^ez(UT=iSw=l2f+a4)DyCA1Cs_N-r?Q@$3KTYosY!;pzQ0k zzh1G|kWCJjc(oZVBji@kN%)UBw(s{KaYGy=i{g3{)Z+&H8t2`^IuLLKWT6lL<-C(! zSF9K4xd-|VO;4}$s?Z7J_dYqD#Mt)WCDnsR{Kpjq275uUq6`v0y*!PHyS(}Zmv)_{>Vose9-$h8P0|y;YG)Bo}$(3Z%+Gs0RBmFiW!^5tBmDK-g zfe5%B*27ib+7|A*Fx5e)2%kIxh7xWoc3pZcXS2zik!63lAG1;sC1ja>BqH7D zODdi5lKW$$AFvxgC-l-)!c+9@YMC7a`w?G(P#MeEQ5xID#<}W$3bSmJ`8V*x2^3qz zVe<^^_8GHqYGF$nIQm0Xq2kAgYtm#UC1A(=&85w;rmg#v906 zT;RyMgbMpYOmS&S9c38^40oUp?!}#_84`aEVw;T;r%gTZkWeU;;FwM@0y0adt{-OK z(vGnPSlR=Nv2OUN!2=xazlnHPM9EWxXg2EKf0kI{iQb#FoP>xCB<)QY>OAM$Dcdbm zU6dU|%Mo(~avBYSjRc13@|s>axhrPl@Sr81{RSZUdz4(=|82XEbV*JAX6Lfbgqgz584lYgi0 z2-E{0XCVON$wHfvaLs;=dqhQJ&6aLn$D#0i(FkAVrXG9LGm3pSTf&f~RQb6|1_;W> z?n-;&hrq*~L=(;u#jS`*Yvh@3hU-33y_Kv1nxqrsf>pHVF&|OKkoC)4DWK%I!yq?P z=vXo8*_1iEWo8xCa{HJ4tzxOmqS0&$q+>LroMKI*V-rxhOc%3Y!)Y|N6p4PLE>Yek>Y(^KRECg8<|%g*nQib_Yc#A5q8Io z6Ig&V>k|~>B6KE%h4reAo*DfOH)_01tE0nWOxX0*YTJgyw7moaI^7gW*WBAeiLbD?FV9GSB zPv3`SX*^GRBM;zledO`!EbdBO_J@fEy)B{-XUTVQv}Qf~PSDpK9+@I`7G7|>Dgbbu z_7sX9%spVo$%qwRwgzq7!_N;#Td08m5HV#?^dF-EV1o)Q=Oa+rs2xH#g;ykLbwtCh znUnA^dW!XjspJ;otq$yV@I^s9Up(5k7rqhQd@OLMyyxVLj_+$#Vc*}Usevp^I(^vH zmDgHc0VMme|K&X?9&lkN{yq_(If)O`oUPW8X}1R5pSVBpfJe0t{sPA(F#`eONTh_) zxeLqHMfJX#?P(@6w4CqRE@Eiza; z;^5)Kk=^5)KDvd9Q<`=sJU8rjjxPmtWMTmzcH={o$U)j=QBuHarp?=}c??!`3d=H$nrJMyr3L-& zA#m?t(NqLM?I3mGgWA_C+0}BWy3-Gj7bR+d+U?n*mN$%5P`ugrB{PeV>jDUn;eVc- zzeMB1mI4?fVJatrNyq|+zn=!AiN~<}eoM#4uSx^K?Iw>P2*r=k`$<3kT00BE_1c(02MRz4(Hq`L^M&xt!pV2 zn+#U3@j~PUR>xIy+P>51iPayk-mqIK_5rlQMSe5&tDkKJk_$i(X&;K(11YGpEc-K= zq4Ln%^j>Zi_+Ae9eYEq_<`D+ddb8_aY!N;)(&EHFAk@Ekg&41ABmOXfWTo)Z&KotA zh*jgDGFYQ^y=m)<_LCWB+v48DTJw*5dwMm_YP0*_{@HANValf?kV-Ic3xsC}#x2h8 z`q5}d8IRmqWk%gR)s~M}(Qas5+`np^jW^oEd-pzERRPMXj$kS17g?H#4^trtKtq;C?;c ztd|%|WP2w2Nzg@)^V}!Gv++QF2!@FP9~DFVISRW6S?eP{H;;8EH;{>X_}NGj^0cg@ z!2@A>-CTcoN02^r6@c~^QUa={0xwK0v4i-tQ9wQq^=q*-{;zJ{Qe%7Qd!&X2>rV@4 z&wznCz*63_vw4>ZF8~%QCM?=vfzW0r_4O^>UA@otm_!N%mH)!ERy&b!n3*E*@?9d^ zu}s^By@FAhG(%?xgJMuMzuJw2&@$-oK>n z=UF}rt%vuaP9fzIFCYN-1&b#r^Cl6RDFIWsEsM|ROf`E?O(cy{BPO2Ie~kT+^kI^i zp>Kbc@C?}3vy-$ZFVX#-cx)Xj&G^ibX{pWggtr(%^?HeQL@Z( zM-430g<{>vT*)jK4aY9(a{lSy{8vxLbP~n1MXwM527ne#SHCC^F_2@o`>c>>KCq9c(4c$VSyMl*y3Nq1s+!DF| z^?d9PipQN(mw^j~{wJ^VOXDCaL$UtwwTpyv8IAwGOg<|NSghkAR1GSNLZ1JwdGJYm zP}t<=5=sNNUEjc=g(y)1n5)ynX(_$1-uGuDR*6Y^Wgg(LT)Jp><5X|}bt z_qMa&QP?l_n+iVS>v%s2Li_;AIeC=Ca^v1jX4*gvB$?H?2%ndnqOaK5-J%7a} zIF{qYa&NfVY}(fmS0OmXA70{znljBOiv5Yod!vFU{D~*3B3Ka{P8?^ zfhlF6o7aNT$qi8(w<}OPw5fqA7HUje*r*Oa(YV%*l0|9FP9KW@U&{VSW{&b0?@y)M zs%4k1Ax;TGYuZ9l;vP5@?3oQsp3)rjBeBvQQ>^B;z5pc=(yHhHtq6|0m(h4envn_j787fizY@V`o(!SSyE7vlMT zbo=Z1c=atz*G!kwzGB;*uPL$Ei|EbZLh8o+1BUMOpnU(uX&OG1MV@|!&HOOeU#t^x zr9=w2ow!SsTuJWT7%Wmt14U_M*3XiWBWHxqCVZI0_g0`}*^&yEG9RK9fHK8e+S^m? zfCNn$JTswUVbiC#>|=wS{t>-MI1aYPLtzO5y|LJ9nm>L6*wpr_m!)A2Fb1RceX&*|5|MwrvOk4+!0p99B9AgP*9D{Yt|x=X}O% zgIG$MrTB=n-!q%ROT|SzH#A$Xm;|ym)0>1KR}Yl0hr-KO&qMrV+0Ej3d@?FcgZ+B3 ztEk16g#2)@x=(ko8k7^Tq$*5pfZHC@O@}`SmzT1(V@x&NkZNM2F#Q-Go7-uf_zKC( zB(lHZ=3@dHaCOf6C!6i8rDL%~XM@rVTJbZL09?ht@r^Z_6x}}atLjvH^4Vk#Ibf(^LiBJFqorm?A=lE zzFmwvp4bT@Nv2V>YQT92X;t9<2s|Ru5#w?wCvlhcHLcsq0TaFLKy(?nzezJ>CECqj zggrI~Hd4LudM(m{L@ezfnpELsRFVFw>fx;CqZtie`$BXRn#Ns%AdoE$-Pf~{9A8rV zf7FbgpKmVzmvn-z(g+&+-ID=v`;6=)itq8oM*+Uz**SMm_{%eP_c0{<%1JGiZS19o z@Gj7$Se~0lsu}w!%;L%~mIAO;AY-2i`9A*ZfFs=X!LTd6nWOZ7BZH2M{l2*I>Xu)0 z`<=;ObglnXcVk!T>e$H?El}ra0WmPZ$YAN0#$?|1v26^(quQre8;k20*dpd4N{i=b zuN=y}_ew9SlE~R{2+Rh^7%PA1H5X(p8%0TpJ=cqa$65XL)$#ign-y!qij3;2>j}I; ziO@O|aYfn&up5F`YtjGw68rD3{OSGNYmBnl?zdwY$=RFsegTZ=kkzRQ`r7ZjQP!H( zp4>)&zf<*N!tI00xzm-ME_a{_I!TbDCr;8E;kCH4LlL-tqLxDuBn-+xgPk37S&S2^ z2QZumkIimwz!c@!r0)j3*(jPIs*V!iLTRl0Cpt_UVNUgGZzdvs0(-yUghJfKr7;=h zD~y?OJ-bWJg;VdZ^r@vlDoeGV&8^--!t1AsIMZ5S440HCVr%uk- z2wV>!W1WCvFB~p$P$$_}|H5>uBeAe>`N1FI8AxM|pq%oNs;ED8x+tb44E) zTj{^fbh@eLi%5AqT?;d>Es5D*Fi{Bpk)q$^iF!!U`r2hHAO_?#!aYmf>G+jHsES4W zgpTKY59d?hsb~F0WE&dUp6lPt;Pm zcbTUqRryw^%{ViNW%Z(o8}dd00H(H-MmQmOiTq{}_rnwOr*Ybo7*}3W-qBT!#s0Ie z-s<1rvvJx_W;ViUD`04%1pra*Yw0BcGe)fDKUK8aF#BwBwMPU;9`!6E(~!043?SZx z13K%z@$$#2%2ovVlgFIPp7Q6(vO)ud)=*%ZSucL2Dh~K4B|%q4KnSpj#n@(0B})!9 z8p*hY@5)NDn^&Pmo;|!>erSYg`LkO?0FB@PLqRvc>4IsUM5O&>rRv|IBRxi(RX(gJ ztQ2;??L~&Mv;aVr5Q@(?y^DGo%pO^~zijld41aA0KKsy_6FeHIn?fNHP-z>$OoWer zjZ5hFQTy*-f7KENRiCE$ZOp4|+Wah|2=n@|W=o}bFM}Y@0e62+_|#fND5cwa3;P{^pEzlJbF1Yq^}>=wy8^^^$I2M_MH(4Dw{F6hm+vrWV5!q;oX z;tTNhz5`-V={ew|bD$?qcF^WPR{L(E%~XG8eJx(DoGzt2G{l8r!QPJ>kpHeOvCv#w zr=SSwMDaUX^*~v%6K%O~i)<^6`{go>a3IdfZ8hFmz&;Y@P%ZygShQZ2DSHd`m5AR= zx$wWU06;GYwXOf(%MFyj{8rPFXD};JCe85Bdp4$YJ2$TzZ7Gr#+SwCvBI1o$QP0(c zy`P51FEBV2HTisM3bHqpmECT@H!Y2-bv2*SoSPoO?wLe{M#zDTy@ujAZ!Izzky~3k zRA1RQIIoC*Mej1PH!sUgtkR0VCNMX(_!b65mo66iM*KQ7xT8t2eev$v#&YdUXKwGm z7okYAqYF&bveHeu6M5p9xheRCTiU8PFeb1_Rht0VVSbm%|1cOVobc8mvqcw!RjrMRM#~=7xibH&Fa5Imc|lZ{eC|R__)OrFg4@X_ ze+kk*_sDNG5^ELmHnZ7Ue?)#6!O)#Nv*Dl2mr#2)w{#i-;}0*_h4A%HidnmclH#;Q zmQbq+P4DS%3}PpPm7K_K3d2s#k~x+PlTul7+kIKol0@`YN1NG=+&PYTS->AdzPv!> zQvzT=)9se*Jr1Yq+C{wbK82gAX`NkbXFZ)4==j4t51{|-v!!$H8@WKA={d>CWRW+g z*`L>9rRucS`vbXu0rzA1#AQ(W?6)}1+oJSF=80Kf_2r~Qm-EJ6bbB3k`80rCv(0d` zvCf3;L2ovYG_TES%6vSuoKfIHC6w;V31!oqHM8-I8AFzcd^+_86!EcCOX|Ta9k1!s z_Vh(EGIIsI3fb&dF$9V8v(sTBC%!#<&KIGF;R+;MyC0~}$gC}}= zR`DbUVc&Bx`lYykFZ4{R{xRaUQkWCGCQlEc;!mf=+nOk$RUg*7 z;kP7CVLEc$CA7@6VFpsp3_t~m)W0aPxjsA3e5U%SfY{tp5BV5jH-5n?YX7*+U+Zs%LGR>U- z!x4Y_|4{gx?ZPJobISy991O znrmrC3otC;#4^&Rg_iK}XH(XX+eUHN0@Oe06hJk}F?`$)KmH^eWz@@N%wEc)%>?Ft z#9QAroDeyfztQ5Qe{m*#R#T%-h*&XvSEn@N$hYRTCMXS|EPwzF3IIysD2waj`vQD{ zv_#^Pgr?s~I*NE=acf@dWVRNWTr(GN0wrL)Z2=`Dr>}&ZDNX|+^Anl{Di%v1Id$_p zK5_H5`RDjJx`BW7hc85|> zHMMsWJ4KTMRHGu+vy*kBEMjz*^K8VtU=bXJYdhdZ-?jTXa$&n)C?QQIZ7ln$qbGlr zS*TYE+ppOrI@AoPP=VI-OXm}FzgXRL)OPvR$a_=SsC<3Jb+>5makX|U!}3lx4tX&L z^C<{9TggZNoeX!P1jX_K5HkEVnQ#s2&c#umzV6s2U-Q;({l+j^?hi7JnQ7&&*oOy9 z(|0asVTWUCiCnjcOnB2pN0DpuTglKq;&SFOQ3pUdye*eT<2()7WKbXp1qq9=bhMWlF-7BHT|i3TEIT77AcjD(v=I207wi-=vyiw5mxgPdTVUC z&h^FEUrXwWs9en2C{ywZp;nvS(Mb$8sBEh-*_d-OEm%~p1b2EpcwUdf<~zmJmaSTO zSX&&GGCEz-M^)G$fBvLC2q@wM$;n4jp+mt0MJFLuJ%c`tSp8$xuP|G81GEd2ci$|M z4XmH{5$j?rqDWoL4vs!}W&!?!rtj=6WKJcE>)?NVske(p;|#>vL|M_$as=mi-n-()a*OU3Okmk0wC<9y7t^D(er-&jEEak2!NnDiOQ99Wx8{S8}=Ng!e0tzj*#T)+%7;aM$ z&H}|o|J1p{IK0Q7JggAwipvHvko6>Epmh4RFRUr}$*2K4dz85o7|3#Bec9SQ4Y*;> zXWjT~f+d)dp_J`sV*!w>B%)#GI_;USp7?0810&3S=WntGZ)+tzhZ+!|=XlQ&@G@~3 z-dw@I1>9n1{+!x^Hz|xC+P#Ab`E@=vY?3%Bc!Po~e&&&)Qp85!I|U<-fCXy*wMa&t zgDk!l;gk;$taOCV$&60z+}_$ykz=Ea*)wJQ3-M|p*EK(cvtIre0Pta~(95J7zoxBN zS(yE^3?>88AL0Wfuou$BM{lR1hkrRibz=+I9ccwd`ZC*{NNqL)3pCcw^ygMmrG^Yp zn5f}Xf>%gncC=Yq96;rnfp4FQL#{!Y*->e82rHgY4Zwy{`JH}b9*qr^VA{%~Z}jtp z_t$PlS6}5{NtTqXHN?uI8ut8rOaD#F1C^ls73S=b_yI#iZDOGz3#^L@YheGd>L;<( z)U=iYj;`{>VDNzIxcjbTk-X3keXR8Xbc`A$o5# zKGSk-7YcoBYuAFFSCjGi;7b<;n-*`USs)IX z=0q6WZ=L!)PkYtZE-6)azhXV|+?IVGTOmMCHjhkBjfy@k1>?yFO3u!)@cl{fFAXnRYsWk)kpT?X{_$J=|?g@Q}+kFw|%n!;Zo}|HE@j=SFMvT8v`6Y zNO;tXN^036nOB2%=KzxB?n~NQ1K8IO*UE{;Xy;N^ZNI#P+hRZOaHATz9(=)w=QwV# z`z3+P>9b?l-@$@P3<;w@O1BdKh+H;jo#_%rr!ute{|YX4g5}n?O7Mq^01S5;+lABE+7`&_?mR_z7k|Ja#8h{!~j)| zbBX;*fsbUak_!kXU%HfJ2J+G7;inu#uRjMb|8a){=^))y236LDZ$$q3LRlat1D)%7K0!q5hT5V1j3qHc7MG9 z_)Q=yQ>rs>3%l=vu$#VVd$&IgO}Za#?aN!xY>-<3PhzS&q!N<=1Q7VJBfHjug^4|) z*fW^;%3}P7X#W3d;tUs3;`O&>;NKZBMR8au6>7?QriJ@gBaorz-+`pUWOP73DJL=M z(33uT6Gz@Sv40F6bN|H=lpcO z^AJl}&=TIjdevuDQ!w0K*6oZ2JBOhb31q!XDArFyKpz!I$p4|;c}@^bX{>AXdt7Bm zaLTk?c%h@%xq02reu~;t@$bv`b3i(P=g}~ywgSFpM;}b$zAD+=I!7`V~}ARB(Wx0C(EAq@?GuxOL9X+ffbkn3+Op0*80TqmpAq~EXmv%cq36celXmRz z%0(!oMp&2?`W)ALA&#|fu)MFp{V~~zIIixOxY^YtO5^FSox8v$#d0*{qk0Z)pNTt0QVZ^$`4vImEB>;Lo2!7K05TpY-sl#sWBz_W-aDIV`Ksabi zvpa#93Svo!70W*Ydh)Qzm{0?CU`y;T^ITg-J9nfWeZ-sbw)G@W?$Eomf%Bg2frfh5 zRm1{|E0+(4zXy){$}uC3%Y-mSA2-^I>Tw|gQx|7TDli_hB>``)Q^aZ`LJC2V3U$SABP}T)%}9g2pF9dT}aC~!rFFgkl1J$ z`^z{Arn3On-m%}r}TGF8KQe*OjSJ=T|caa_E;v89A{t@$yT^(G9=N9F?^kT*#s3qhJq!IH5|AhnqFd z0B&^gm3w;YbMNUKU>naBAO@fbz zqw=n!@--}o5;k6DvTW9pw)IJVz;X}ncbPVrmH>4x);8cx;q3UyiML1PWp%bxSiS|^ zC5!kc4qw%NSOGQ*Kcd#&$30=lDvs#*4W4q0u8E02U)7d=!W7+NouEyuF1dyH$D@G& zaFaxo9Ex|ZXA5y{eZT*i*dP~INSMAi@mvEX@q5i<&o&#sM}Df?Og8n8Ku4vOux=T% zeuw~z1hR}ZNwTn8KsQHKLwe2>p^K`YWUJEdVEl|mO21Bov!D0D$qPoOv=vJJ`)|%_ z>l%`eexY7t{BlVKP!`a^U@nM?#9OC*t76My_E_<16vCz1x_#82qj2PkWiMWgF8bM9 z(1t4VdHcJ;B~;Q%x01k_gQ0>u2*OjuEWNOGX#4}+N?Gb5;+NQMqp}Puqw2HnkYuKA zzKFWGHc&K>gwVgI1Sc9OT1s6fq=>$gZU!!xsilA$fF`kLdGoX*^t}ao@+^WBpk>`8 z4v_~gK|c2rCq#DZ+H)$3v~Hoi=)=1D==e3P zpKrRQ+>O^cyTuWJ%2}__0Z9SM_z9rptd*;-9uC1tDw4+A!=+K%8~M&+Zk#13hY$Y$ zo-8$*8dD5@}XDi19RjK6T^J~DIXbF5w&l?JLHMrf0 zLv0{7*G!==o|B%$V!a=EtVHdMwXLtmO~vl}P6;S(R2Q>*kTJK~!}gloxj)m|_LYK{ zl(f1cB=EON&wVFwK?MGn^nWuh@f95SHatPs(jcwSY#Dnl1@_gkOJ5=f`%s$ZHljRH0 z+c%lrb=Gi&N&1>^L_}#m>=U=(oT^vTA&3!xXNyqi$pdW1BDJ#^{h|2tZc{t^vag3& zAD7*8C`chNF|27itjBUo^CCDyEpJLX3&u+(L;YeeMwnXEoyN(ytoEabcl$lSgx~Ltatn}b$@j_yyMrBb03)shJE*$;Mw=;mZd&8e>IzE+4WIoH zCSZE7WthNUL$|Y#m!Hn?x7V1CK}V`KwW2D$-7&ODy5Cj;!_tTOOo1Mm%(RUt)#$@3 zhurA)t<7qik%%1Et+N1?R#hdBB#LdQ7{%-C zn$(`5e0eFh(#c*hvF>WT*07fk$N_631?W>kfjySN8^XC9diiOd#s?4tybICF;wBjp zIPzilX3{j%4u7blhq)tnaOBZ_`h_JqHXuI7SuIlNTgBk9{HIS&3|SEPfrvcE<@}E` zKk$y*nzsqZ{J{uWW9;#n=de&&h>m#A#q)#zRonr(?mDOYU&h&aQWD;?Z(22wY?t$U3qo`?{+amA$^TkxL+Ex2dh`q7iR&TPd0Ymwzo#b? zP$#t=elB5?k$#uE$K>C$YZbYUX_JgnXA`oF_Ifz4H7LEOW~{Gww&3s=wH4+j8*TU| zSX%LtJWqhr-xGNSe{;(16kxnak6RnZ{0qZ^kJI5X*It_YuynSpi(^-}Lolr{)#z_~ zw!(J-8%7Ybo^c3(mED`Xz8xecP35a6M8HarxRn%+NJBE;dw>>Y2T&;jzRd4FSDO3T zt*y+zXCtZQ0bP0yf6HRpD|WmzP;DR^-g^}{z~0x~z4j8m zucTe%k&S9Nt-?Jb^gYW1w6!Y3AUZ0Jcq;pJ)Exz%7k+mUOm6%ApjjSmflfKwBo6`B zhNb@$NHTJ>guaj9S{@DX)!6)b-Shav=DNKWy(V00k(D!v?PAR0f0vDNq*#mYmUp6> z76KxbFDw5U{{qx{BRj(>?|C`82ICKbfLxoldov-M?4Xl+3;I4GzLHyPOzYw7{WQST zPNYcx5onA%MAO9??41Po*1zW(Y%Zzn06-lUp{s<3!_9vv9HBjT02On0Hf$}NP;wF) zP<`2p3}A^~1YbvOh{ePMx$!JGUPX-tbBzp3mDZMY;}h;sQ->!p97GA)9a|tF(Gh{1$xk7 zUw?ELkT({Xw!KIr);kTRb1b|UL`r2_`a+&UFVCdJ)1T#fdh;71EQl9790Br0m_`$x z9|ZANuchFci8GNZ{XbP=+uXSJRe(;V5laQz$u18#?X*9}x7cIEbnr%<=1cX3EIu7$ zhHW6pe5M(&qEtsqRa>?)*{O;OJT+YUhG5{km|YI7I@JL_3Hwao9aXneiSA~a* z|Lp@c-oMNyeAEuUz{F?kuou3x#C*gU?lon!RC1s37gW^0Frc`lqQWH&(J4NoZg3m8 z;Lin#8Q+cFPD7MCzj}#|ws7b@?D9Q4dVjS4dpco=4yX5SSH=A@U@yqPdp@?g?qeia zH=Tt_9)G=6C2QIPsi-QipnK(mc0xXIN;j$WLf@n8eYvMk;*H-Q4tK%(3$CN}NGgO8n}fD~+>?<3UzvsrMf*J~%i;VKQHbF%TPalFi=#sgj)(P#SM^0Q=Tr>4kJVw8X3iWsP|e8tj}NjlMdWp z@2+M4HQu~3!=bZpjh;;DIDk&X}=c8~kn)FWWH z2KL1w^rA5&1@@^X%MjZ7;u(kH=YhH2pJPFQe=hn>tZd5RC5cfGYis8s9PKaxi*}-s6*W zRA^PwR=y^5Z){!(4D9-KC;0~;b*ploznFOaU`bJ_7U?qAi#mTo!&rIECRL$_y@yI27x2?W+zqDBD5~KCVYKFZLK+>ABC(Kj zeAll)KMgIlAG`r^rS{loBrGLtzhHY8$)<_S<(Dpkr(Ym@@vnQ&rS@FC*>2@XCH}M+an74WcRDcoQ+a3@A z9tYhl5$z7bMdTvD2r&jztBuo37?*k~wcU9GK2-)MTFS-lux-mIRYUuGUCI~V$?s#< z?1qAWb(?ZLm(N>%S%y10COdaq_Tm5c^%ooIxpR=`3e4C|@O5wY+eLik&XVi5oT7oe zmxH)Jd*5eo@!7t`x8!K=-+zJ-Sz)B_V$)s1pW~CDU$=q^&ABvf6S|?TOMB-RIm@CoFg>mjIQE)?+A1_3s6zmFU_oW&BqyMz1mY*IcP_2knjq5 zqw~JK(cVsmzc7*EvTT2rvpeqhg)W=%TOZ^>f`rD4|7Z5fq*2D^lpCttIg#ictgqZ$P@ru6P#f$x#KfnfTZj~LG6U_d-kE~`;kU_X)`H5so@?C zWmb!7x|xk@0L~0JFall*@ltyiL^)@3m4MqC7(7H0sH!WidId1#f#6R{Q&A!XzO1IAcIx;$k66dumt6lpUw@nL2MvqJ5^kbOVZ<^2jt5-njy|2@`07}0w z;M%I1$FCoLy`8xp8Tk)bFr;7aJeQ9KK6p=O$U0-&JYYy8woV*>b+FB?xLX`=pirYM z5K$BA(u)+jR{?O2r$c_Qvl?M{=Ar{yQ!UVsVn4k@0!b?_lA;dVz9uaQUgBH8Oz(Sb zrEs;&Ey>_ex8&!N{PmQjp+-Hlh|OA&wvDai#GpU=^-B70V0*LF=^bi+Nhe_o|azZ%~ZZ1$}LTmWt4aoB1 zPgccm$EwYU+jrdBaQFxQfn5gd(gM`Y*Ro1n&Zi?j=(>T3kmf94vdhf?AuS8>$Va#P zGL5F+VHpxdsCUa}+RqavXCobI-@B;WJbMphpK2%6t=XvKWWE|ruvREgM+|V=i6;;O zx$g=7^`$XWn0fu!gF=Xe9cMB8Z_SelD>&o&{1XFS`|nInK3BXlaeD*rc;R-#osyIS zWv&>~^TLIyBB6oDX+#>3<_0+2C4u2zK^wmHXXDD9_)kmLYJ!0SzM|%G9{pi)`X$uf zW}|%%#LgyK7m(4{V&?x_0KEDq56tk|0YNY~B(Sr|>WVz-pO3A##}$JCT}5P7DY+@W z#gJv>pA5>$|E3WO2tV7G^SuymB?tY`ooKcN3!vaQMnBNk-WATF{-$#}FyzgtJ8M^; zUK6KWSG)}6**+rZ&?o@PK3??uN{Q)#+bDP9i1W&j)oaU5d0bIWJ_9T5ac!qc?x66Q z$KUSZ`nYY94qfN_dpTFr8OW~A?}LD;Yty-BA)-be5Z3S#t2Io%q+cAbnGj1t$|qFR z9o?8B7OA^KjCYL=-!p}w(dkC^G6Nd%_I=1))PC0w5}ZZGJxfK)jP4Fwa@b-SYBw?% zdz9B-<`*B2dOn(N;mcTm%Do)rIvfXRNFX&1h`?>Rzuj~Wx)$p13nrDlS8-jwq@e@n zNIj_|8or==8~1h*Ih?w*8K7rYkGlwlTWAwLKc5}~dfz3y`kM&^Q|@C%1VAp_$wnw6zG~W4O+^ z>i?NY?oXf^Puc~+fDM$VgRNBpOZj{2cMP~gCqWAX4 z7>%$ux8@a&_B(pt``KSt;r+sR-$N;jdpY>|pyvPiN)9ohd*>mVST3wMo)){`B(&eX z1?zZJ-4u9NZ|~j1rdZYq4R$?swf}<6(#ex%7r{kh%U@kT)&kWuAszS%oJts=*OcL9 zaZwK<5DZw%1IFHXgFplP6JiL^dk8+SgM$D?8X+gE4172hXh!WeqIO>}$I9?Nry$*S zQ#f)RuH{P7RwA3v9f<-w>{PSzom;>(i&^l{E0(&Xp4A-*q-@{W1oE3K;1zb{&n28dSC2$N+6auXe0}e4b z)KLJ?5c*>@9K#I^)W;uU_Z`enquTUxr>mNq z1{0_puF-M7j${rs!dxxo3EelGodF1TvjV;Zpo;s{5f1pyCuRp=HDZ?s#IA4f?h|-p zGd|Mq^4hDa@Bh!c4ZE?O&x&XZ_ptZGYK4$9F4~{%R!}G1leCBx`dtNUS|K zL-7J5s4W@%mhXg1!}a4PD%!t&Qn%f_oquRajn3@C*)`o&K9o7V6DwzVMEhjVdDJ1fjhr#@=lp#@4EBqi=CCQ>73>R(>QKPNM&_Jpe5G`n4wegeC`FYEPJ{|vwS>$-`fuRSp3927qOv|NC3T3G-0 zA{K`|+tQy1yqE$ShWt8ny&5~)%ITb@^+x$w0)f&om;P8B)@}=Wzy59BwUfZ1vqw87 za2lB8J(&*l#(V}Id8SyQ0C(2amzkz3EqG&Ed0Jq1)$|&>4_|NIe=5|n=3?siFV0fI z{As5DLW^gs|B-b4C;Hd(SM-S~GQhzb>HgF2|2Usww0nL^;x@1eaB)=+Clj+$fF@H( z-fqP??~QMT$KI-#m;QC*&6vkp&8699G3)Bq0*kFZXINw=b9OVaed(3(3kS|IZ)CM? zJdnW&%t8MveBuK21uiYj)_a{Fnw0OErMzMN?d$QoPwkhOwcP&p+t>P)4tHlYw-pPN z^oJ=uc$Sl>pv@fZH~ZqxSvdhF@F1s=oZawpr^-#l{IIOGG=T%QXjtwPhIg-F@k@uIlr?J->Ia zpEUQ*=4g|XYn4Gez&aHr*;t$u3oODPmc2Ku)2Og|xjc%w;q!Zz+zY)*3{7V8bK4;& zYV82FZ+8?v)`J|G1w4I0fWdKg|2b#iaazCv;|?(W-q}$o&Y}Q5d@BRk^jL7#{kbCK zSgkyu;=DV+or2)AxCBgq-nj5=@n^`%T#V+xBGEkW4lCqrE)LMv#f;AvD__cQ@Eg3`~x| zW+h9mofSXCq5|M)9|ez(#X?-sxB%Go8};sJ?2abp(Y!lyi>k)|{M*Z$c{e1-K4ky` MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/index.html b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/manifest.json b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/.gitignore b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/main.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/resource.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/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/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/exception_indicator.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/exception_indicator.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/quote_card.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/quote_card.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/search_bar.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/search_bar.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/pubspec.yaml index ef623590..d75f7082 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/pubspec.yaml @@ -2,7 +2,7 @@ name: component_library publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/domain_models/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/domain_models/pubspec.yaml index 5ceb1524..b09f3aa3 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/domain_models/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/domain_models/pubspec.yaml @@ -2,7 +2,7 @@ name: domain_models publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: equatable: ^2.0.3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/pubspec.yaml index 33bdf0a1..b8f9e302 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/pubspec.yaml @@ -2,7 +2,7 @@ name: fav_qs_api publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: dio: ^4.0.0 @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/common_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/pubspec.yaml index ee52bc20..fc6d79ab 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/forgot_my_password/pubspec.yaml @@ -2,7 +2,7 @@ name: forgot_my_password publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/pubspec.yaml index c796c6e8..8f33a7c1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/profile_menu/pubspec.yaml @@ -2,7 +2,7 @@ name: profile_menu publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/l10n.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/quote_details.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/quote_details.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/pubspec.yaml index ef369d62..5f16c003 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_details/pubspec.yaml @@ -2,14 +2,14 @@ name: quote_details publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: path: ../../component_library equatable: ^2.0.3 flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/pubspec.yaml index b0383f58..7eef55f0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/quote_list/pubspec.yaml @@ -2,7 +2,7 @@ name: quote_list publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/pubspec.yaml index 3812d6b2..9f15389f 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/pubspec.yaml @@ -2,7 +2,7 @@ name: sign_in publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/pubspec.yaml index 25f7c6c3..bf170f01 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/sign_up/pubspec.yaml @@ -2,7 +2,7 @@ name: sign_up publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/pubspec.yaml index b1d749c3..11b78caf 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/features/update_profile/pubspec.yaml @@ -2,7 +2,7 @@ name: update_profile publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: component_library: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/form_fields/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/form_fields/pubspec.yaml index 9ec161e6..feed53bc 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/form_fields/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/form_fields/pubspec.yaml @@ -2,7 +2,7 @@ name: form_fields publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: formz: ^0.4.1 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/key_value_storage/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/key_value_storage/pubspec.yaml index 2f7b3d07..bca9f9c8 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/key_value_storage/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/key_value_storage/pubspec.yaml @@ -2,7 +2,7 @@ name: key_value_storage publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: hive: 2.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart index 84afa653..c2b15a41 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,12 +1,18 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; + +export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' + show SocialMetaTagParameters; typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -14,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml index 81b7b55f..9ee1fb00 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml @@ -2,16 +2,16 @@ name: monitoring publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: flutter: sdk: flutter - # TODO: Add firebase core and crashlytics packages - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^8.3.0 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/quote_repository/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/quote_repository/pubspec.yaml index dbaa90a4..e01d8c24 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/quote_repository/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/quote_repository/pubspec.yaml @@ -2,7 +2,7 @@ name: quote_repository publish_to: none environment: - sdk: ">=2.13.0 <4.0.0" + sdk: ">=2.13.0 <3.0.0" dependencies: equatable: ^2.0.3 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/pubspec.yaml index fdcb1d4b..6428373a 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/pubspec.yaml @@ -2,7 +2,7 @@ name: user_repository publish_to: none environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: fav_qs_api: @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/common_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock index 395148b9..803bac5d 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -77,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -91,7 +98,7 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.4" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -126,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -134,83 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.2" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.13.1" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.5" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.1" + version: "1.6.6" + firebase_crashlytics: + dependency: transitive + description: + name: firebase_crashlytics + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.4" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -223,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -248,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -287,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -294,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -311,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -337,7 +364,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -358,28 +385,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: @@ -394,20 +421,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -428,49 +448,49 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.14" path_provider_ios: dependency: transitive description: name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" petitparser: dependency: transitive description: @@ -540,7 +560,7 @@ packages: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" rxdart: dependency: transitive description: @@ -554,42 +574,42 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -615,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -650,28 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -685,35 +712,35 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.2" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: @@ -727,14 +754,14 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -749,13 +776,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.4" + version: "2.5.2" xdg_directories: dependency: transitive description: diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.yaml index b0f56d45..b2dd1e71 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.yaml @@ -18,14 +18,14 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.14.0 <4.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^1.0.0 + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/example_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From cf5ae3af6cdb9a42b399aeb91b5e3ea785ddfb3b Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:28:11 +0200 Subject: [PATCH 11/30] Chapter 13 starter updated --- .../project/starter/.gitmodules | 4 - .../project/starter/.metadata | 10 - .../starter/integration_test/app_test.dart | 24 + .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../project/starter/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 94 ++- .../project/starter/ios/Runner/Info.plist | 15 + .../starter/ios/Runner/Runner.entitlements | 10 + .../starter/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../project/starter/lib/l10n/messages_pt.arb | 4 + .../project/starter/lib/main.dart | 54 +- .../project/starter/lib/routes.dart | 178 ------ .../project/starter/lib/routing_table.dart | 174 ++++++ ..._screen.dart => tab_container_screen.dart} | 4 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../example/test/widget_test.dart | 30 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 ++++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 ++ .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../favorite_icon_button_widget_test.dart | 46 ++ .../component_library/test/widget_test.dart | 15 - .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../models/response/quote_list_page_rm.g.dart | 29 +- .../lib/src/models/response/quote_rm.g.dart | 53 +- .../models/response/quote_user_info_rm.g.dart | 30 +- .../lib/src/models/response/user_rm.g.dart | 21 +- .../starter/packages/fav_qs_api/pubspec.yaml | 7 +- .../packages/fav_qs_api/test/common_test.dart | 15 - .../fav_qs_api/test/sign_in_test.dart | 62 ++ .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 ++ .../lib/src/profile_menu_screen.dart | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 ---- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 2 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 ++ .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 65 +- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.yaml | 5 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 ++ .../packages/features/sign_in/pubspec.yaml | 3 +- .../sign_in/test/sign_in_cubit_test.dart | 21 + .../features/sign_in/test/widget_test.dart | 15 - .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../monitoring/lib/src/analytics_service.dart | 2 +- .../lib/src/dynamic_link_service.dart | 62 +- .../lib/src/remote_value_service.dart | 2 +- .../starter/packages/monitoring/pubspec.yaml | 11 +- .../packages/user_repository/pubspec.yaml | 5 +- .../user_repository/test/common_test.dart | 15 - .../user_repository/test/mappers_test.dart | 26 + .../test/user_repository_test.dart | 40 ++ .../test/user_repository_test.mocks.dart | 53 ++ .../project/starter/pubspec.lock | 212 ++++--- .../project/starter/pubspec.yaml | 4 +- .../project/starter/test/example_test.dart | 17 + .../project/starter/test/widget_test.dart | 15 - 217 files changed, 6056 insertions(+), 879 deletions(-) delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.gitmodules delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.metadata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/integration_test/app_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Runner.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/messages_pt.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routes.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routing_table.dart rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/{home_screen.dart => tab_container_screen.dart} (92%) create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.metadata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/README.md create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/analysis_options.yaml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/build.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/build.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle.properties create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/settings.gradle create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/main.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/stories.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/story_app.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/main.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/pubspec.yaml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/favicon.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/index.html create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/manifest.json create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/.gitignore create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/common_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/sign_in_cubit_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/widget_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/common_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.mocks.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/example_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/widget_test.dart diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.gitmodules b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.metadata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/integration_test/app_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/integration_test/app_test.dart new file mode 100644 index 00000000..34c5841f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/integration_test/app_test.dart @@ -0,0 +1,24 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:wonder_words/main.dart' as app; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('search for life quotes', (tester) async { + app.main(); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final searchBarFinder = find.byType(SearchBar); + + expect(searchBarFinder, findsOneWidget); + + await tester.enterText(searchBarFinder, 'life'); + + await tester.pumpAndSettle(); + + expect(find.byType(QuoteCard), findsWidgets); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Flutter/AppFrameworkInfo.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Flutter/AppFrameworkInfo.plist +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Podfile b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Podfile +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner.xcodeproj/project.pbxproj index 4aa99011..3053d607 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; @@ -31,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -50,11 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -87,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -118,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -146,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -231,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -245,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -281,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -379,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -452,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -527,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Info.plist index 9065509e..80173535 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Info.plist +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Runner.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/main.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/main.dart index 7b63a05f..aff906c9 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/main.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -18,7 +18,7 @@ import 'package:sign_up/sign_up.dart'; import 'package:update_profile/update_profile.dart'; import 'package:user_repository/user_repository.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; +import 'package:wonder_words/routing_table.dart'; import 'package:wonder_words/screen_view_observer.dart'; void main() async { @@ -87,37 +87,45 @@ class _WonderWordsState extends State { remoteApi: _favQsApi, noSqlStorage: _keyValueStorage, ); - late final _navigator = RoutemasterDelegate( + + late final _routerDelegate = RoutemasterDelegate( observers: [ ScreenViewObserver( analyticsService: _analyticsService, ), ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - remoteValueService: widget.remoteValueService, - dynamicLinkService: _dynamicLinkService, - ), + routesBuilder: (context) { + return RouteMap( + routes: buildRoutingTable( + routerDelegate: _routerDelegate, + userRepository: _userRepository, + quoteRepository: _quoteRepository, + remoteValueService: widget.remoteValueService, + dynamicLinkService: _dynamicLinkService, + ), + ); + }, ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _navigator.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { - _navigator.push(path); + _routerDelegate.push(path); } } @@ -127,6 +135,7 @@ class _WonderWordsState extends State { stream: _userRepository.getDarkModePreference(), builder: (context, snapshot) { final darkModePreference = snapshot.data; + return WonderTheme( lightTheme: _lightTheme, darkTheme: _darkTheme, @@ -134,24 +143,35 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, UpdateProfileLocalizations.delegate, ], - routerDelegate: _navigator, + routerDelegate: _routerDelegate, routeInformationParser: const RoutemasterParser(), ), ); }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routes.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routes.dart deleted file mode 100644 index 124b8468..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routes.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - required RemoteValueService remoteValueService, - required DynamicLinkService dynamicLinkService, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - remoteValueService: remoteValueService, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onSignUpTap: () { - navigator.push( - _RoutePaths.signUpPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? '', - ), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '${homePath}sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routing_table.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routing_table.dart new file mode 100644 index 00000000..20f37847 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/routing_table.dart @@ -0,0 +1,174 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:flutter/material.dart'; +import 'package:forgot_my_password/forgot_my_password.dart'; +import 'package:monitoring/monitoring.dart'; +import 'package:profile_menu/profile_menu.dart'; +import 'package:quote_details/quote_details.dart'; +import 'package:quote_list/quote_list.dart'; +import 'package:quote_repository/quote_repository.dart'; +import 'package:routemaster/routemaster.dart'; +import 'package:sign_in/sign_in.dart'; +import 'package:sign_up/sign_up.dart'; +import 'package:update_profile/update_profile.dart'; +import 'package:user_repository/user_repository.dart'; +import 'package:wonder_words/tab_container_screen.dart'; + +Map buildRoutingTable({ + required RoutemasterDelegate routerDelegate, + required UserRepository userRepository, + required QuoteRepository quoteRepository, + required RemoteValueService remoteValueService, + required DynamicLinkService dynamicLinkService, +}) { + return { + _PathConstants.tabContainerPath: (_) => CupertinoTabPage( + child: const TabContainerScreen(), + paths: [ + _PathConstants.quoteListPath, + _PathConstants.profileMenuPath, + ], + ), + _PathConstants.quoteListPath: (route) { + return MaterialPage( + name: 'quotes-list', + child: QuoteListScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onAuthenticationError: (context) { + routerDelegate.push(_PathConstants.signInPath); + }, + onQuoteSelected: (id) { + final navigation = routerDelegate.push( + _PathConstants.quoteDetailsPath( + quoteId: id, + ), + ); + return navigation.result; + }, + remoteValueService: remoteValueService, + ), + ); + }, + _PathConstants.profileMenuPath: (_) { + return MaterialPage( + name: 'profile-menu', + child: ProfileMenuScreen( + quoteRepository: quoteRepository, + userRepository: userRepository, + onSignInTap: () { + routerDelegate.push( + _PathConstants.signInPath, + ); + }, + onSignUpTap: () { + routerDelegate.push( + _PathConstants.signUpPath, + ); + }, + onUpdateProfileTap: () { + routerDelegate.push( + _PathConstants.updateProfilePath, + ); + }, + ), + ); + }, + _PathConstants.updateProfilePath: (_) => MaterialPage( + name: 'update-profile', + child: UpdateProfileScreen( + userRepository: userRepository, + onUpdateProfileSuccess: () { + routerDelegate.pop(); + }, + ), + ), + _PathConstants.quoteDetailsPath(): (info) => MaterialPage( + name: 'quote-details', + child: QuoteDetailsScreen( + quoteRepository: quoteRepository, + quoteId: int.parse( + info.pathParameters[_PathConstants.idPathParameter] ?? '', + ), + onAuthenticationError: () { + routerDelegate.push(_PathConstants.signInPath); + }, + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, + ), + ), + _PathConstants.signInPath: (_) => MaterialPage( + name: 'sign-in', + fullscreenDialog: true, + child: Builder( + builder: (context) { + return SignInScreen( + userRepository: userRepository, + onSignInSuccess: () { + routerDelegate.pop(); + }, + onSignUpTap: () { + routerDelegate.push(_PathConstants.signUpPath); + }, + onForgotMyPasswordTap: () { + showDialog( + context: context, + builder: (context) { + return ForgotMyPasswordDialog( + userRepository: userRepository, + onCancelTap: () { + routerDelegate.pop(); + }, + onEmailRequestSuccess: () { + routerDelegate.pop(); + }, + ); + }, + ); + }, + ); + }, + ), + ), + _PathConstants.signUpPath: (_) => MaterialPage( + name: 'sign-up', + child: SignUpScreen( + userRepository: userRepository, + onSignUpSuccess: () { + routerDelegate.pop(); + }, + ), + ), + }; +} + +class _PathConstants { + const _PathConstants._(); + + static String get tabContainerPath => '/'; + + static String get quoteListPath => '${tabContainerPath}quotes'; + + static String get profileMenuPath => '${tabContainerPath}user'; + + static String get updateProfilePath => '$profileMenuPath/update-profile'; + + static String get signInPath => '${tabContainerPath}sign-in'; + + static String get signUpPath => '${tabContainerPath}sign-up'; + + static String get idPathParameter => 'id'; + + static String quoteDetailsPath({ + int? quoteId, + }) => + '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/home_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/tab_container_screen.dart similarity index 92% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/home_screen.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/tab_container_screen.dart index 573ae1f7..ec226b71 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/home_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/lib/tab_container_screen.dart @@ -3,8 +3,8 @@ import 'package:flutter/material.dart'; import 'package:routemaster/routemaster.dart'; import 'package:wonder_words/l10n/app_localizations.dart'; -class HomeScreen extends StatelessWidget { - const HomeScreen({ +class TabContainerScreen extends StatelessWidget { + const TabContainerScreen({ Key? key, }) : super(key: key); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/closing-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/closing-quote.svg +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/opening-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/opening-quote.svg +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.metadata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.metadata new file mode 100644 index 00000000..e27f5ccf --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/.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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/README.md b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/settings.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/loader.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/component_storybook.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/main.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/stories.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/story_app.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/main.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Release.entitlements b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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:example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/favicon.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-192.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-512.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/index.html b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/manifest.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/Runner.rc b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/main.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/resource.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.cpp b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/exception_indicator.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/exception_indicator.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/quote_card.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/quote_card.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/search_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/search_bar.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart new file mode 100644 index 00000000..b27b6a3f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -0,0 +1,46 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart index 563ddeac..2daaf185 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart @@ -6,17 +6,20 @@ part of 'quote_list_page_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), +QuoteListPageRM _$QuoteListPageRMFromJson(Map json) => + $checkedCreate( + 'QuoteListPageRM', + json, + ($checkedConvert) { + final val = QuoteListPageRM( + isLastPage: $checkedConvert('last_page', (v) => v as bool), + quoteList: $checkedConvert( + 'quotes', + (v) => (v as List) + .map((e) => QuoteRM.fromJson(e as Map)) + .toList()), + ); + return val; + }, + fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}, ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart index a3dfa67c..e17768c0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart @@ -6,30 +6,31 @@ part of 'quote_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), +QuoteRM _$QuoteRMFromJson(Map json) => $checkedCreate( + 'QuoteRM', + json, + ($checkedConvert) { + final val = QuoteRM( + id: $checkedConvert('id', (v) => v as int), + body: $checkedConvert('body', (v) => v as String?), + favoritesCount: + $checkedConvert('favorites_count', (v) => v as int? ?? 0), + upvotesCount: $checkedConvert('upvotes_count', (v) => v as int? ?? 0), + downvotesCount: + $checkedConvert('downvotes_count', (v) => v as int? ?? 0), + author: $checkedConvert('author', (v) => v as String?), + userInfo: $checkedConvert( + 'user_details', + (v) => v == null + ? null + : QuoteUserInfoRM.fromJson(v as Map)), + ); + return val; + }, + fieldKeyMap: const { + 'favoritesCount': 'favorites_count', + 'upvotesCount': 'upvotes_count', + 'downvotesCount': 'downvotes_count', + 'userInfo': 'user_details' + }, ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart index 847bfd47..576f4a33 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart @@ -6,17 +6,21 @@ part of 'quote_user_info_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), +QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) => + $checkedCreate( + 'QuoteUserInfoRM', + json, + ($checkedConvert) { + final val = QuoteUserInfoRM( + isFavorite: $checkedConvert('favorite', (v) => v as bool), + isUpvoted: $checkedConvert('upvote', (v) => v as bool), + isDownvoted: $checkedConvert('downvote', (v) => v as bool), + ); + return val; + }, + fieldKeyMap: const { + 'isFavorite': 'favorite', + 'isUpvoted': 'upvote', + 'isDownvoted': 'downvote' + }, ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart index 083f8ae8..fbc30230 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart @@ -6,13 +6,16 @@ part of 'user_rm.dart'; // JsonSerializableGenerator // ************************************************************************** -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), +UserRM _$UserRMFromJson(Map json) => $checkedCreate( + 'UserRM', + json, + ($checkedConvert) { + final val = UserRM( + token: $checkedConvert('User-Token', (v) => v as String), + username: $checkedConvert('login', (v) => v as String), + email: $checkedConvert('email', (v) => v as String), + ); + return val; + }, + fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}, ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/pubspec.yaml index 4ba8e5da..b8f9e302 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/pubspec.yaml @@ -10,8 +10,9 @@ dependencies: json_annotation: ^4.0.1 dev_dependencies: - mocktail: 0.1.4 + http_mock_adapter: ^0.3.3 + mockito: ^5.2.0 build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 + json_serializable: ^6.2.0 + test: ^1.21.2 lints: ^1.0.1 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart new file mode 100644 index 00000000..87cee833 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -0,0 +1,62 @@ +import 'package:dio/dio.dart'; +import 'package:fav_qs_api/src/fav_qs_api.dart'; +import 'package:fav_qs_api/src/models/exceptions.dart'; +import 'package:fav_qs_api/src/models/models.dart'; +import 'package:fav_qs_api/src/url_builder.dart'; +import 'package:http_mock_adapter/http_mock_adapter.dart'; +import 'package:test/test.dart'; + +void main() { + group('Sign in:', () { + final dio = Dio(BaseOptions()); + final dioAdapter = DioAdapter(dio: dio); + + const email = 'email'; + const password = 'password'; + + final remoteApi = + FavQsApi(userTokenSupplier: () => Future.value(), dio: dio); + + final url = const UrlBuilder().buildSignInUrl(); + + final requestJsonBody = const SignInRequestRM( + credentials: UserCredentialsRM( + email: email, + password: password, + ), + ).toJson(); + + test( + 'When sign in call completes successfully, returns an instance of UserRM', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"User-Token": "token", "login": "login", "email": "email"}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + + expect(await remoteApi.signIn(email, password), isA()); + }); + + // Challange: + test( + 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', + () async { + dioAdapter.onPost( + url, + (server) => server.reply( + 200, + {"error_code": 21, "message": "Invalid login or password."}, + delay: const Duration(seconds: 1), + ), + data: requestJsonBody, + ); + expect(() async => await remoteApi.signIn(email, password), + throwsA(isA())); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/quote_details.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/quote_details.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/quote_details_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/pubspec.yaml index 4ef00398..5f16c003 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_details/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: path: ../../component_library equatable: ^2.0.3 flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 + share_plus: ^4.0.10 flutter: sdk: flutter quote_repository: diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 02013e13..3a404f25 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,40 +138,37 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - // TODO: display different UI based on the value of grid_quotes_view_enabled parameter - QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + // TODO: display different UI based on the value of grid_quotes_view_enabled parameter + child: QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + )), + ), + ], ), ), ), diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/pubspec.yaml index 34294525..7eef55f0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/pubspec.yaml @@ -20,10 +20,7 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/pubspec.yaml index 71824a86..9f15389f 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/pubspec.yaml @@ -20,7 +20,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: 0.1.4 + bloc_test: ^9.0.3 + mockito: ^5.2.0 test: ^1.16.8 flutter_lints: ^1.0.4 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/sign_in_cubit_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/sign_in_cubit_test.dart new file mode 100644 index 00000000..7f7c74cc --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -0,0 +1,21 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:form_fields/form_fields.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sign_in/src/sign_in_cubit.dart'; +import 'package:user_repository/user_repository.dart'; + +class MockUserRepository extends Mock implements UserRepository {} + +void main() { + blocTest( + 'Emits SignInState with unvalidated email when email is changed for the first time', + build: () => SignInCubit(userRepository: MockUserRepository()), + act: (cubit) => cubit.onEmailChanged('email@gmail.com'), + expect: () => const [ + SignInState( + email: Email.unvalidated( + 'email@gmail.com', + )) + ], + ); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/analytics_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/analytics_service.dart index dcc3a202..d6db4664 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/analytics_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/analytics_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; class AnalyticsService { AnalyticsService({ @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); + }) : _analytics = analytics ?? FirebaseAnalytics.instance; final FirebaseAnalytics _analytics; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/dynamic_link_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart index 01d1f29b..b9694b58 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -1,4 +1,4 @@ -// TODO: import firebase_remote_config package +import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:flutter/foundation.dart'; /// Wrapper around [FirebaseRemoteConfig]. diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml index 223a6f82..9ee1fb00 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml @@ -7,12 +7,11 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^8.3.0 - # TODO: add firebase_remote_config package - package_info: ^2.0.2 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 + firebase_analytics: ^9.1.12 + firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/pubspec.yaml index 3aed0203..6428373a 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: flutter_secure_storage: ^4.2.0 dev_dependencies: - mocktail: 0.1.4 + mockito: ^5.2.0 test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart new file mode 100644 index 00000000..92015d11 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart @@ -0,0 +1,26 @@ +import 'package:domain_models/domain_models.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/mappers/mappers.dart'; + +// Rund with: flutter test test/mappers_test.dart +void main() { + group('Mapper test:', () { + test( + 'When mapping DarkModePreferenceCM.alwaysDark to domain, return DarkModePreference.alwaysDark', + () { + final preference = DarkModePreferenceCM.alwaysDark; + + expect(preference.toDomainModel(), DarkModePreference.alwaysDark); + }); + + // Challange + test( + 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', + () { + final preference = DarkModePreference.alwaysDark; + + expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart new file mode 100644 index 00000000..3b5d574a --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart @@ -0,0 +1,40 @@ +import 'package:fav_qs_api/fav_qs_api.dart'; +import 'package:key_value_storage/key_value_storage.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; +import 'package:user_repository/src/user_secure_storage.dart'; +import 'package:user_repository/user_repository.dart'; + +import 'user_repository_test.mocks.dart'; + +@GenerateMocks([UserSecureStorage]) +void main() { + group('User authentication token:', () { + final _userSecureStorage = MockUserSecureStorage(); + + final _userRepository = UserRepository( + secureStorage: _userSecureStorage, + noSqlStorage: KeyValueStorage(), + remoteApi: FavQsApi( + userTokenSupplier: () => Future.value(), + ), + ); + + test( + 'When calling getUserToken after successful authentication, return authentication token', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => 'token'); + + expect(await _userRepository.getUserToken(), 'token'); + }); + // Challange + test( + 'When calling getUserToken before successful authentication, return authentication null', + () async { + when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); + + expect(await _userRepository.getUserToken(), null); + }); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.mocks.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.mocks.dart new file mode 100644 index 00000000..e309ec8f --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.mocks.dart @@ -0,0 +1,53 @@ +// Mocks generated by Mockito 5.2.0 from annotations +// in user_repository/test/user_repository_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:user_repository/src/user_secure_storage.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types + +/// A class which mocks [UserSecureStorage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserSecureStorage extends _i1.Mock implements _i2.UserSecureStorage { + MockUserSecureStorage() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future upsertUserInfo( + {String? username, String? email, String? token}) => + (super.noSuchMethod( + Invocation.method(#upsertUserInfo, [], + {#username: username, #email: email, #token: token}), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future deleteUserInfo() => + (super.noSuchMethod(Invocation.method(#deleteUserInfo, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i3.Future); + @override + _i3.Future getUserToken() => + (super.noSuchMethod(Invocation.method(#getUserToken, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUserEmail() => + (super.noSuchMethod(Invocation.method(#getUserEmail, []), + returnValue: Future.value()) as _i3.Future); + @override + _i3.Future getUsername() => + (super.noSuchMethod(Invocation.method(#getUsername, []), + returnValue: Future.value()) as _i3.Future); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.lock b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.lock index 9cd552a4..803bac5d 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.lock +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,14 +63,14 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" component_library: dependency: "direct main" description: @@ -77,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -91,7 +98,7 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.4" + version: "4.0.6" domain_models: dependency: "direct main" description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -126,7 +133,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: @@ -134,76 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.2" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.0" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.13.1" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.5" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.1" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.5.3" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" + firebase_remote_config: + dependency: transitive + description: + name: firebase_remote_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + firebase_remote_config_platform_interface: + dependency: transitive + description: + name: firebase_remote_config_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.10" + firebase_remote_config_web: + dependency: transitive + description: + name: firebase_remote_config_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -216,6 +244,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: @@ -241,7 +274,7 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: @@ -280,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -287,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -304,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -323,14 +357,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" key_value_storage: dependency: "direct main" description: @@ -351,28 +385,28 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" monitoring: dependency: "direct main" description: @@ -387,20 +421,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: @@ -421,49 +448,49 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.10" path_provider_android: dependency: transitive description: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.14" path_provider_ios: dependency: transitive description: name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.6" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" petitparser: dependency: transitive description: @@ -533,7 +560,7 @@ packages: name: routemaster url: "https://pub.dartlang.org" source: hosted - version: "0.9.5" + version: "1.0.1" rxdart: dependency: transitive description: @@ -547,42 +574,42 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "4.0.10" share_plus_linux: dependency: transitive description: name: share_plus_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.0" share_plus_macos: dependency: transitive description: name: share_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "3.0.3" share_plus_web: dependency: transitive description: name: share_plus_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.1" share_plus_windows: dependency: transitive description: name: share_plus_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.1" sign_in: dependency: "direct main" description: @@ -608,14 +635,14 @@ packages: name: sliver_tools url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.2.6" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -643,28 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -678,35 +712,35 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.2" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: @@ -720,14 +754,14 @@ packages: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "2.0.11" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" user_repository: dependency: "direct main" description: @@ -741,14 +775,28 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.4" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -764,5 +812,5 @@ packages: source: hosted version: "5.3.1" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.yaml index cfac12ce..b2dd1e71 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - routemaster: ^0.9.5 + routemaster: ^1.0.1 key_value_storage: path: packages/key_value_storage fav_qs_api: @@ -60,6 +60,8 @@ dependencies: cupertino_icons: ^1.0.2 dev_dependencies: + integration_test: + sdk: flutter flutter_test: sdk: flutter flutter_lints: ^1.0.4 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/example_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/example_test.dart new file mode 100644 index 00000000..7fff0391 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/example_test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Group description', () { + setUp(() {}); + test('Test 1 description', () { + expect(1, 1); + }); + test('Test 2 description', () { + expect(1, 1); + }); + tearDown(() {}); + }); + test('Test 3 description', () { + expect(1, 1); + }); +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From 3cfbec97fc074db48aebaffe71b20bf60e7eefc9 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:40:20 +0200 Subject: [PATCH 12/30] Removing challenger for chapter 13 --- .../project/challange/.gitignore | 126 --- .../project/challange/.gitmodules | 4 - .../project/challange/.metadata | 10 - .../project/challange/analysis_options.yaml | 1 - .../project/challange/android/.gitignore | 11 - .../challange/android/app/build.gradle | 60 -- .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 45 - .../wonder_words/MainActivity.kt | 6 - .../res/drawable-v21/launch_background.xml | 12 - .../main/res/drawable/launch_background.xml | 12 - .../main/res/mipmap-hdpi/launcher_icon.png | Bin 2606 -> 0 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 1671 -> 0 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 3496 -> 0 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 5155 -> 0 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 7091 -> 0 bytes .../app/src/main/res/values-night/styles.xml | 18 - .../app/src/main/res/values/strings.xml | 4 - .../app/src/main/res/values/styles.xml | 18 - .../app/src/profile/AndroidManifest.xml | 7 - .../project/challange/android/build.gradle | 31 - .../challange/android/gradle.properties | 3 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../project/challange/android/settings.gradle | 11 - .../challange/android/settings_aar.gradle | 1 - .../project/challange/ios/.gitignore | 33 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../challange/ios/Flutter/Debug.xcconfig | 2 - .../challange/ios/Flutter/Release.xcconfig | 2 - .../project/challange/ios/Podfile | 41 - .../ios/Runner.xcodeproj/project.pbxproj | 588 ------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 78 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../challange/ios/Runner/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 122 --- .../Icon-App-1024x1024@1x.png | Bin 45287 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 480 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 982 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1478 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 689 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1460 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 2122 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 982 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1945 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2747 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2747 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3743 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1839 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3099 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3369 -> 0 bytes .../ios/Runner/Assets.xcassets/Contents.json | 6 - .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/README.md | 5 - .../logo-raywenderlich-1-300x300-1.png | Bin 9867 -> 0 bytes .../logo-raywenderlich-1-300x300.png | Bin 9867 -> 0 bytes .../LaunchImage.imageset/logo.png | Bin 9867 -> 0 bytes .../Runner/Base.lproj/LaunchScreen.storyboard | 41 - .../Base.lproj/LaunchScreenDev.storyboard | 41 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - .../project/challange/ios/Runner/Info.plist | 47 -- .../ios/Runner/Runner-Bridging-Header.h | 1 - .../project/challange/l10n.yaml | 5 - .../project/challange/lib/home_screen.dart | 37 - .../challange/lib/l10n/app_localizations.dart | 137 --- .../lib/l10n/app_localizations_en.dart | 15 - .../challange/lib/l10n/messages_en.arb | 4 - .../project/challange/lib/main.dart | 168 ---- .../project/challange/lib/routes.dart | 178 ---- .../challange/lib/screen_view_observer.dart | 35 - .../project/challange/makefile | 109 --- .../component_library/analysis_options.yaml | 1 - .../assets/Fondamento-Regular.ttf | Bin 87160 -> 0 bytes .../assets/closing-quote.svg | 11 - .../assets/opening-quote.svg | 19 - .../packages/component_library/l10n.yaml | 6 - .../lib/component_library.dart | 24 - ...thentication_required_error_snack_bar.dart | 23 - .../centered_circular_progress_indicator.dart | 12 - .../lib/src/chevron_list_tile.dart | 29 - .../lib/src/count_indicator_icon_button.dart | 43 - .../lib/src/downvote_icon_button.dart | 29 - .../lib/src/exception_indicator.dart | 68 -- .../lib/src/expanded_elevated_button.dart | 51 -- .../lib/src/favorite_icon_button.dart | 25 - .../lib/src/generic_error_snack_bar.dart | 22 - .../lib/src/in_progress_text_button.dart | 24 - .../l10n/component_library_localizations.dart | 194 ----- .../component_library_localizations_en.dart | 42 - .../lib/src/l10n/messages_en.arb | 13 - .../component_library/lib/src/quote_card.dart | 92 -- .../lib/src/rounded_choice_chip.dart | 51 -- .../lib/src/row_app_bar.dart | 35 - .../component_library/lib/src/search_bar.dart | 30 - .../lib/src/share_icon_button.dart | 23 - .../lib/src/shrinkable_text.dart | 24 - .../lib/src/styled_status_bar.dart | 41 - .../component_library/lib/src/svg_asset.dart | 78 -- .../lib/src/theme/font_size.dart | 8 - .../lib/src/theme/spacing.dart | 10 - .../lib/src/theme/wonder_theme.dart | 33 - .../lib/src/theme/wonder_theme_data.dart | 133 --- .../lib/src/upvote_icon_button.dart | 28 - .../packages/component_library/pubspec.yaml | 30 - .../component_library/test/widget_test.dart | 15 - .../domain_models/analysis_options.yaml | 5 - .../domain_models/lib/domain_models.dart | 8 - .../lib/src/dark_mode_preference.dart | 1 - .../domain_models/lib/src/exceptions.dart | 9 - .../packages/domain_models/lib/src/quote.dart | 38 - .../lib/src/quote_list_page.dart | 18 - .../packages/domain_models/lib/src/tag.dart | 1 - .../packages/domain_models/lib/src/user.dart | 9 - .../packages/domain_models/pubspec.yaml | 12 - .../domain_models/test/common_test.dart | 15 - .../packages/fav_qs_api/analysis_options.yaml | 5 - .../challange/packages/fav_qs_api/build.yaml | 6 - .../packages/fav_qs_api/lib/fav_qs_api.dart | 3 - .../fav_qs_api/lib/src/fav_qs_api.dart | 235 ------ .../fav_qs_api/lib/src/models/exceptions.dart | 9 - .../fav_qs_api/lib/src/models/models.dart | 11 - .../password_reset_email_request_rm.dart | 16 - .../password_reset_email_request_rm.g.dart | 13 - .../models/request/sign_in_request_rm.dart | 16 - .../models/request/sign_in_request_rm.g.dart | 12 - .../models/request/sign_up_request_rm.dart | 16 - .../models/request/sign_up_request_rm.g.dart | 12 - .../request/update_user_request_rm.dart | 16 - .../request/update_user_request_rm.g.dart | 13 - .../models/request/user_credentials_rm.dart | 18 - .../models/request/user_credentials_rm.g.dart | 13 - .../lib/src/models/request/user_email_rm.dart | 15 - .../src/models/request/user_email_rm.g.dart | 12 - .../lib/src/models/request/user_info_rm.dart | 21 - .../src/models/request/user_info_rm.g.dart | 14 - .../models/response/quote_list_page_rm.dart | 19 - .../models/response/quote_list_page_rm.g.dart | 22 - .../lib/src/models/response/quote_rm.dart | 31 - .../lib/src/models/response/quote_rm.g.dart | 35 - .../models/response/quote_user_info_rm.dart | 21 - .../models/response/quote_user_info_rm.g.dart | 22 - .../lib/src/models/response/user_rm.dart | 21 - .../lib/src/models/response/user_rm.g.dart | 18 - .../fav_qs_api/lib/src/url_builder.dart | 73 -- .../packages/fav_qs_api/pubspec.yaml | 17 - .../packages/fav_qs_api/test/common_test.dart | 15 - .../forgot_my_password/analysis_options.yaml | 1 - .../features/forgot_my_password/l10n.yaml | 6 - .../lib/forgot_my_password.dart | 2 - .../lib/src/forgot_my_password_cubit.dart | 69 -- .../lib/src/forgot_my_password_dialog.dart | 162 ---- .../lib/src/forgot_my_password_state.dart | 35 - .../forgot_my_password_localizations.dart | 176 ---- .../forgot_my_password_localizations_en.dart | 32 - .../lib/src/l10n/messages_en.arb | 10 - .../features/forgot_my_password/pubspec.yaml | 26 - .../forgot_my_password/test/widget_test.dart | 15 - .../profile_menu/analysis_options.yaml | 1 - .../packages/features/profile_menu/l10n.yaml | 6 - .../profile_menu/lib/profile_menu.dart | 2 - .../lib/src/dark_mode_preference_picker.dart | 82 -- .../profile_menu/lib/src/l10n/messages_en.arb | 19 - .../src/l10n/profile_menu_localizations.dart | 187 ----- .../l10n/profile_menu_localizations_en.dart | 39 - .../lib/src/profile_menu_bloc.dart | 63 -- .../lib/src/profile_menu_event.dart | 29 - .../lib/src/profile_menu_screen.dart | 200 ----- .../lib/src/profile_menu_state.dart | 45 - .../features/profile_menu/pubspec.yaml | 32 - .../profile_menu/test/widget_test.dart | 15 - .../quote_details/analysis_options.yaml | 1 - .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 2 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 --- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_cubit.dart | 94 --- .../lib/src/quote_details_screen.dart | 236 ------ .../lib/src/quote_details_state.dart | 35 - .../features/quote_details/pubspec.yaml | 28 - .../quote_details/test/widget_test.dart | 15 - .../features/quote_list/analysis_options.yaml | 1 - .../packages/features/quote_list/l10n.yaml | 6 - .../features/quote_list/lib/quote_list.dart | 2 - .../lib/src/filter_horizontal_list.dart | 148 ---- .../quote_list/lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_list_localizations.dart | 175 ---- .../src/l10n/quote_list_localizations_en.dart | 31 - .../quote_list/lib/src/quote_list_bloc.dart | 385 --------- .../quote_list/lib/src/quote_list_event.dart | 86 -- .../quote_list/lib/src/quote_list_screen.dart | 207 ----- .../quote_list/lib/src/quote_list_state.dart | 226 ----- .../quote_list/lib/src/quote_sliver_grid.dart | 85 -- .../quote_list/lib/src/quote_sliver_list.dart | 77 -- .../packages/features/quote_list/pubspec.yaml | 37 - .../features/quote_list/test/widget_test.dart | 15 - .../features/sign_in/analysis_options.yaml | 1 - .../packages/features/sign_in/l10n.yaml | 6 - .../features/sign_in/lib/sign_in.dart | 2 - .../sign_in/lib/src/l10n/messages_en.arb | 14 - .../lib/src/l10n/sign_in_localizations.dart | 198 ----- .../src/l10n/sign_in_localizations_en.dart | 44 - .../sign_in/lib/src/sign_in_cubit.dart | 121 --- .../sign_in/lib/src/sign_in_screen.dart | 243 ------ .../sign_in/lib/src/sign_in_state.dart | 49 -- .../packages/features/sign_in/pubspec.yaml | 28 - .../features/sign_in/test/widget_test.dart | 15 - .../features/sign_up/analysis_options.yaml | 1 - .../packages/features/sign_up/l10n.yaml | 6 - .../features/sign_up/lib/sign_up.dart | 2 - .../sign_up/lib/src/l10n/messages_en.arb | 19 - .../lib/src/l10n/sign_up_localizations.dart | 228 ----- .../src/l10n/sign_up_localizations_en.dart | 65 -- .../sign_up/lib/src/sign_up_cubit.dart | 200 ----- .../sign_up/lib/src/sign_up_screen.dart | 282 ------- .../sign_up/lib/src/sign_up_state.dart | 49 -- .../packages/features/sign_up/pubspec.yaml | 28 - .../features/sign_up/test/widget_test.dart | 15 - .../update_profile/analysis_options.yaml | 1 - .../features/update_profile/l10n.yaml | 6 - .../lib/src/l10n/messages_en.arb | 16 - .../l10n/update_profile_localizations.dart | 211 ----- .../l10n/update_profile_localizations_en.dart | 54 -- .../lib/src/update_profile_cubit.dart | 214 ----- .../lib/src/update_profile_screen.dart | 271 ------ .../lib/src/update_profile_state.dart | 64 -- .../update_profile/lib/update_profile.dart | 2 - .../features/update_profile/pubspec.yaml | 29 - .../update_profile/test/widget_test.dart | 15 - .../form_fields/analysis_options.yaml | 5 - .../packages/form_fields/lib/form_fields.dart | 9 - .../packages/form_fields/lib/src/email.dart | 48 -- .../lib/src/optional_password.dart | 29 - .../src/optional_password_confirmation.dart | 45 - .../form_fields/lib/src/password.dart | 27 - .../lib/src/password_confirmation.dart | 39 - .../form_fields/lib/src/username.dart | 45 - .../packages/form_fields/pubspec.yaml | 13 - .../form_fields/test/common_test.dart | 15 - .../key_value_storage/analysis_options.yaml | 5 - .../lib/key_value_storage.dart | 3 - .../lib/src/key_value_storage.dart | 74 -- .../src/models/dark_mode_preference_cm.dart | 13 - .../src/models/dark_mode_preference_cm.g.dart | 51 -- .../lib/src/models/models.dart | 3 - .../lib/src/models/quote_cm.dart | 37 - .../lib/src/models/quote_cm.g.dart | 65 -- .../lib/src/models/quote_list_page_cm.dart | 17 - .../lib/src/models/quote_list_page_cm.g.dart | 44 - .../packages/key_value_storage/pubspec.yaml | 15 - .../key_value_storage/test/common_test.dart | 15 - .../packages/monitoring/analysis_options.yaml | 5 - .../packages/monitoring/lib/monitoring.dart | 8 - .../monitoring/lib/src/analytics_service.dart | 27 - .../lib/src/dynamic_link_service.dart | 68 -- .../lib/src/error_reporting_service.dart | 27 - .../lib/src/remote_value_service.dart | 24 - .../packages/monitoring/pubspec.yaml | 19 - .../quote_repository/analysis_options.yaml | 5 - .../lib/quote_repository.dart | 1 - .../lib/src/mappers/cache_to_domain.dart | 31 - .../lib/src/mappers/domain_to_remote.dart | 22 - .../lib/src/mappers/mappers.dart | 4 - .../lib/src/mappers/remote_to_cache.dart | 31 - .../lib/src/mappers/remote_to_domain.dart | 31 - .../lib/src/quote_local_storage.dart | 122 --- .../lib/src/quote_repository.dart | 218 ----- .../packages/quote_repository/pubspec.yaml | 19 - .../quote_repository/test/common_test.dart | 15 - .../user_repository/analysis_options.yaml | 5 - .../lib/src/mappers/cache_to_domain.dart | 15 - .../lib/src/mappers/domain_to_cache.dart | 15 - .../lib/src/mappers/mappers.dart | 3 - .../lib/src/mappers/remote_to_domain.dart | 11 - .../lib/src/user_local_storage.dart | 19 - .../lib/src/user_repository.dart | 173 ---- .../lib/src/user_secure_storage.dart | 58 -- .../user_repository/lib/user_repository.dart | 1 - .../packages/user_repository/pubspec.yaml | 20 - .../user_repository/test/common_test.dart | 15 - .../challange/propagate-config-files.sh | 199 ----- .../project/challange/pubspec.lock | 789 ------------------ .../project/challange/pubspec.yaml | 83 -- .../project/challange/test/widget_test.dart | 15 - 288 files changed, 12908 deletions(-) delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitignore delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitmodules delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.metadata delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/.gitignore delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/build.gradle delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/debug/AndroidManifest.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/AndroidManifest.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/kotlin/com/raywenderlich/wonder_words/MainActivity.kt delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-hdpi/launcher_icon.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-mdpi/launcher_icon.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values-night/styles.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/strings.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/styles.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/profile/AndroidManifest.xml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/build.gradle delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle.properties delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings.gradle delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings_aar.gradle delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/.gitignore delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Debug.xcconfig delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Release.xcconfig delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Podfile delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/AppDelegate.swift delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/Contents.json delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300-1.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo.png delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreenDev.storyboard delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Info.plist delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Runner-Bridging-Header.h delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/home_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/main.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/routes.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/screen_view_observer.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/makefile delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/Fondamento-Regular.ttf delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/closing-quote.svg delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/opening-quote.svg delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/component_library.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/authentication_required_error_snack_bar.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/centered_circular_progress_indicator.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/chevron_list_tile.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/count_indicator_icon_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/downvote_icon_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/exception_indicator.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/expanded_elevated_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/favorite_icon_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/generic_error_snack_bar.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/in_progress_text_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/quote_card.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/rounded_choice_chip.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/row_app_bar.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/search_bar.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/share_icon_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/shrinkable_text.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/styled_status_bar.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/svg_asset.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/font_size.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/spacing.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme_data.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/upvote_icon_button.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/domain_models.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/dark_mode_preference.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/exceptions.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote_list_page.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/tag.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/user.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/build.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/fav_qs_api.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/fav_qs_api.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/exceptions.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/models.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/url_builder.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/forgot_my_password.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/profile_menu.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_bloc.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_event.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/quote_details.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_cubit.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/quote_list.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/filter_horizontal_list.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_bloc.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_event.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_grid.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_list.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/sign_in.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_cubit.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/sign_up.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_cubit.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/l10n.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/messages_en.arb delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_cubit.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_screen.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_state.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/update_profile.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/test/widget_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/form_fields.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/email.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password_confirmation.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password_confirmation.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/username.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/key_value_storage.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/key_value_storage.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/models.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.g.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/monitoring.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/analytics_service.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/dynamic_link_service.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/error_reporting_service.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/quote_repository.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/cache_to_domain.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/domain_to_remote.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/mappers.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_cache.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_domain.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_local_storage.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_repository.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/analysis_options.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/cache_to_domain.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/domain_to_cache.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/mappers.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/remote_to_domain.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_local_storage.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_repository.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_secure_storage.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/user_repository.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/test/common_test.dart delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/propagate-config-files.sh delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.lock delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.yaml delete mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/test/widget_test.dart diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitignore deleted file mode 100644 index a801afa8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitignore +++ /dev/null @@ -1,126 +0,0 @@ -# Miscellaneous -*.class -*.lock -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/* - -# Visual Studio Code related -.classpath -.project -.settings/ -.vscode/* - -# Flutter repo-specific -/bin/cache/ -/bin/mingit/ -/dev/benchmarks/mega_gallery/ -/dev/bots/.recipe_deps -/dev/bots/android_tools/ -/dev/docs/doc/ -/dev/docs/flutter.docs.zip -/dev/docs/lib/ -/dev/docs/pubspec.yaml -/dev/integration_tests/**/xcuserdata -/dev/integration_tests/**/Pods -/packages/flutter/coverage/ -version - -# packages file containing multi-root paths -.packages.generated - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ -flutter_*.png -linked_*.ds -unlinked.ds -unlinked_spec.ds -.fvm/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java -**/android/key.properties -**/android/.idea/ -*.jks - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/.last_build_id -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Coverage -coverage/ - -# Submodules -!pubspec.lock -packages/**/pubspec.lock - -# Web related -lib/generated_plugin_registrant.dart - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Exceptions to the above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -!/dev/ci/**/Gemfile.lock -!.vscode/launch.json -!.idea/codeStyles/ -!.idea/dictionaries/ -!.idea/runConfigurations/ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitmodules b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.metadata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/.gitignore deleted file mode 100644 index 0a741cb4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/build.gradle deleted file mode 100644 index 7d93d0b6..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ -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' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'kotlin-android' -apply plugin: 'com.google.firebase.crashlytics' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 31 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - applicationId "com.raywenderlich.wonder_words" - minSdkVersion 21 - targetSdkVersion 30 - 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" -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/debug/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index a4c81059..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 12339aa7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/kotlin/com/raywenderlich/wonder_words/MainActivity.kt b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/kotlin/com/raywenderlich/wonder_words/MainActivity.kt deleted file mode 100644 index ed8f2a11..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/kotlin/com/raywenderlich/wonder_words/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.raywenderlich.wonder_words - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable-v21/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index 0d0d696d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable/launch_background.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 03205927c66d55c5c2d29d1a99f078242f078e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 zcmV+}3eok6P)Dl<0a4oszz*A;C^m~{{Bv=eM_Wk)t5|1FC_}45!dLT*jyIAP}M%XlZwuv-TQLJ!u%^w{=rTF{_zQX(jw zI|L)s!?xeEueAw&+5ZWKJ--GLfu82y!N|-qj16OY)p-)+vR#5mwMJ&;fH#dH$IFn+ z+IT}mi_Z-Yt@skj*`hhy0d4-|P9M%XBNez)gl9N$nI)m=@ zIXHaoV+-!UM_+3jl5-gM)+*;Hch%-8PV99CO%r6zY)4+QH`7Il`vQ!|cfpaN_e4)- z7eW{eJhXydz<_ejgKxas#|FTpW~v=BO^~y0>B&lNJW*tP^AJn@2_@$(`;BtnHuPAJ z6`ku8)C`44l0%jx?zoRnP(4Ut=PxF-Dn&@6&DjYD&+fCGoN!QpW$k-GYb1P5H8l*< zFK&e(?y!bOQ0?+VHs^n{rQ}?NbK}2-e+(aKNLqD$*LM87yyzTFK9mk!)N~G4Agouh zOhHbi$~c3>Y=_fhLp5H}9K0wDeQi${og<^{*AbGs2&$DK5?hx;^%C*)iH4Cw*wDKf zNxEM-rU`_IPrq&z2|>P!)ha<`_*y(_lpgf{29~zH02d~8gF#Et5pcuW$eW;*h#nuG z2)A;c>rQ#me0^@d!^@&{CPd9RSlfmKeOg`HfCsj$+6^IL5RLi)IR4)~Fp;QkJaAv% z6ZrRb<(OVnz@RHCaa_Y_y^$u+gd>p@m857{`wkTQPb(Ve7M}|S*L;rd`El_$9K0RL zYJx9L{juVhsV5YIp5{Huvy;iWNic5XRs@ZkMleoy)B}ojrZRHGz7YnN+*2{E*xdh; zLJoriCFunixcLa2xcIGM+f6HW0j)xj(dp9?pbu5WxYOVEjDy50I2cJ|Np`)}ov)&? z-U_j_e*I0$A3)XKE$-8Ehw#y6vaId;?!7P+y&F|c|4k1pS%pMCuN(_b=D8|CRj~xG ziajbOgC+;b7E#Vwa6ba~E!~bG#(}bW_x9e41pXChmX%)3EdjJ0q$9I3Nq4}*{rlkX z&@(WdEY{O-(2J2eg%s*43sS9W(lxRKjmJ$(kTtQGQ;K~qh%d;A-t1j8*vH^pbV{kS zv3Cu2@N3*_7hg+nKsBs1xSPGk##XKVr(o-?$D=J+KjPN3CK;` zAnQP#B}tkR1J-Vgk#-|NJH_896|t_HB&S_GrdUbqbzG8~UY6Efg@l(-osOa{W6AwB zkzSObT}pkDzMFj2%fFab7Au={^Hw7wu$faDJkqMQbzL8#3%`hl^)LAADzOgDu6B6K z+mfq}rsUAYjfC#UA;SPf6LAbFUIuL>P6I-tB|D{%qxv}~h`b5eg;7xwyy%r)$C!=S zV5&iZ8eAu3LpzYh*#zMT4_&2^x(_(N%n|V zs#Q`?LljuvyoQ{#Jt}4emGzrP(7anKXbV(=XwIIvDEl;tM^J82$dF19g*`;lWN8(B zg5v2ccxxQ1Tu)F5qG33Vg{mYdk;y}=MXq!{L#riTw{C~|Hb@>LG-|E%Tp+JuC>#jD zg)#wJp@PAY1pYvA@j-XGg-1|&QP?0Yq6t$3U3Xt6*Nt>m_xp7o zK`Bvs$jaOK&DdN+?Hct~S19-@CO2EiPzj=mwrhG-^a&b|&q8Ogc$~1XLF#2ng4kLf z{cqqG4pa%Esb5{s%_E3S<}Z$zo-m1C%)~e-lbc}M1;S84>N|Bu{AW}kD7$yv^~ zK0JbkC;tsUx9os$@Gb}m5xg>G{b}xqawY+(9TlR@RkH7Z;&sPv;8R79o+~+)#Wt(i z7NmM|eJbQ>XQh&n>dC*!RAiu>mW*_rB#h2b+fg_<@*(H>xap1p9Q}#b+*J211*I!B zvIND17|qM5GgIZqY#U4Exr?qE0Bh#OST1)#y1eUa;&2XdgP;nyK~M$!AEDgn=+UC3 QxBvhE07*qoM6N<$f(6gmV*mgE diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index bb3c5bbfb374a4216810949d95497d1323f7c17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 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 RKb-&o002ovPDHLkV1j6qon`<4 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index f0a687ad7334f44ca7f7905874a4f18292e10de0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7091 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 z 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 S2=71R0Llt#^5wE70sjY7kFd!A diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values-night/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 449a9f93..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/strings.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/strings.xml deleted file mode 100644 index b5abb67f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - WonderWords - \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/styles.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/styles.xml deleted file mode 100644 index d74aa35c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/profile/AndroidManifest.xml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index a4c81059..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/build.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/build.gradle deleted file mode 100644 index a4793051..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '1.6.10' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle.properties deleted file mode 100644 index 94adc3a3..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle/wrapper/gradle-wrapper.properties b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index bc6a58af..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings.gradle deleted file mode 100644 index 44e62bcf..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings_aar.gradle b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings_aar.gradle deleted file mode 100644 index e7b4def4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/android/settings_aar.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/.gitignore b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/.gitignore deleted file mode 100644 index 151026b9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/AppFrameworkInfo.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 8d4492f9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 9.0 - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Debug.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Release.xcconfig b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bfe..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Podfile b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Podfile deleted file mode 100644 index 1e8c3c90..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Podfile +++ /dev/null @@ -1,41 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.pbxproj b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 4aa99011..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,588 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 51; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; - 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 */; }; - FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; -/* End PBXBuildFile 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 */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; - 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, - ); - 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 = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, - 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 = ""; - }; - A231D06941EC426CD09FC4D3 /* Pods */ = { - isa = PBXGroup; - children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, - 18D5ABA327EF75FA008E4DC0 /* ShellScript */, - ); - 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 = { - 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 */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; - }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - 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\n"; - }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase 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 */ - BB141C0626CFD1FC000800DE /* 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - BB141C0726CFD1FC000800DE /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - 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; - }; - BB141C0826CFD229000800DE /* 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 = 10.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; - }; - BB141C0926CFD229000800DE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - BB141C0A26CFD23A000800DE /* 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 = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - BB141C0B26CFD23A000800DE /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - APP_DISPLAY_NAME = WonderWords; - 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", - ); - LaunchScreen = LaunchScreen; - PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.wonderWords; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BB141C0626CFD1FC000800DE /* Debug */, - BB141C0826CFD229000800DE /* Release */, - BB141C0A26CFD23A000800DE /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BB141C0726CFD1FC000800DE /* Debug */, - BB141C0926CFD229000800DE /* Release */, - BB141C0B26CFD23A000800DE /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 271470a7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/contents.xcworkspacedata b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/AppDelegate.swift b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index f1baaf4030fc757c03226fa7fa537de7a9a4b106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45287 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
pRt=ekgBSgCysr`#^$)g2g=zhqLTaAPesU0c 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 aOk_*&w{h~Nbs#(um diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 40a864fdeae4d5f0ffb94b6c9e0c92ce7f22c301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)%jICh*qtBSdVaaovQ;EI1@hkqq^3 zRQ%kQ*HDb(sg3uZ1$(^eCMVCIQT_0e`#F>n(5N+%8@4b>K6Y_YL#6H|V=8tsSXR*; z+SRpSN&K~-kGg@I7w5GQL%oB6!S}maEGkeX-b*`urv~HoNU10#an;1NKOpG&2~VXa^n`fsPo7suddb*mNklh7Of<$jFp4re?3Qgi&=yaYX1bl3-<+8<-Dy!!V&6C>Y2a$d$NY0PzlfZj4~@FW&sdYPxk`pM;Q^ZJwpSR0+xzswaEO}IsBm`uBqShb?zmdn)L1cA&Tx|uIV#rW?#AKrR{_Rx()2@z{J(jSAZM^s? zM4gP`Tt64$T3M082U)-gu0bZzSj}PE3W~2Acs3_QCBeBh$_3i=5kI>nyM9+ZTe)mU zXDSK!t0lZ&5u%b!B@j?}k_Urjm)zS`0KDITGUGd8sw(5s02g`#Q0;YST3oh}qPt*OA)YN@s)R+WJQxCxRT$G<#0))BtBmvc9lW z8CWhZT6vvXIj7g#S%@GDujKl)$ z)ASI|_VIaPI8?^(m1?C$v&DA>53q;F1%a&IJlJ72m^7u$ z4s-wBYkUG=?-NM7*VwdjP|9UJy9aMGcXR?SCMJeu~WX|J7ODP^VBdd3U3Pyrs+J_* zc1<$+)a+4rFmG~k2$BZT?{?_Ma-yFaJvuaK@04D@r-3yOa&ZWfu2-0`u9BYP)8U9r z92O6vs1*6QU*qwsQ`$YEBV+!A89~zJB7d&yRQ6pTjhJ-LqVABo;@RWIL?$#ZB*#-mUjwKeu#A1Cm}Q*w0VF;>e<`0cM&<}lTRq0 z^R7ga%^8ty59oD=>~M})m|Dz;Q%~+Y?y{h=g~)QXS*Qmr@1WzPP)Iyd#}qJr`l*)~ zZakGi@g48_HRG5KaHNgF1c z-5A*uXk=HFqBFiO6vJVsN~fnH-7uX2f(Qh>*GO{{kAg}MH=Hr*j~hkrtE7@n;yntk z0JyNt#+Zbd$0^}WJ&^n)A|10FVO+~Qk#B32bZwGXUe)>YtQ$K4PkeOC8JBZZ3Gzuq z8nGvdA?o7phTw`M;dxB_g9}3mLlc$$%a5GkrwB2J);X#7NCNu-%_awwofy(c9&E-W zszxL|QANT!JaFg0{))NqgjsqI5^4=sikuEsj|U?|@&i{M)_DMrI}oAxn|t)bE;ajs zX>fD4m|=glB1HktGKI|$Tp$}%;C+ji`0o?1$%Guu&MNaNmyC!$Z#qow+k5ompWZY? z6PSdJx-Kt1pe+#gyKo~V18F>Fy~u=M`{4cSK3~L&BYz;VvRfs#vx?#v075iGYe!9g zG+EJTIliEjX-KxNDcF=XZhAl&c13;h^fMMJ9(23p=%^xGuWhyC)&gGAjwY&YfANoy ztw1)?Ahe;=OJR{nDF;J`3gYmR@6PZxt9d#TAqg%8!nQS@L<=rI(a+AFGzp7@lKj*2 zaNXrqeKsrutfet<6>dXaY{7fNFyGfiGiGg#D$e?q)$6 z4@Sa{)rZu}@i&CQ85*6t;S;Z?M;x;hv&^UcfaXaB><8YhULv#2#Rx3;`iJJ*7$qsU z=Gq>DlH6V5Sd&ZKe8c2OMs(pDMRvD4IjkhrxNJEt4d5c%%~|X%IY`i!VQtyJE3(+6 zt&!Bmf}~MCjTY%Oq`PWi(kL<3WGUihVaz$`KrYthO^b1V9uCCUgN%@#e;*f6dg0%5K9O{{Cn4n~4C~9aH@#HOAJRet`hmz>0L>G^& zgo`r!@-Dx+*FIO`~~=x6`H2 zJ9S(wpscXwkr%jOQ5Sz1!f^275O2Cm%_#Qk6{rF(NH87nT#~;OK0&ExKlPVFNxKck zswgaz!i+NQGhuN9HC7LEIaMX>l(5%o8=O+0?>+1#$NT9srU7UqUUacxm4Hc`v5>2tq{Mh;blMSZJ=mu+m9*tDVyOx>g} zx|zf!$pQ)~?AGyPfMy<-Ro17)6mC}W^EX?km@Daqe+ ziMYywzqYd;t{ku X{2RGMo3C-@00000NkvXXu0mjfne$Eo diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index 7106c08f484fad38df0cbf809848359bdd8c9834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 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 AcmMzZ diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 98d270d271118ddaa5aba882a6b6d1d8ff0ea801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 779282c12191fad4e7d046e5ddb73f885b17781e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 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 JPDHLkV1iRG4_N>J diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 41a3dd2257afee329a47a0ecd4441c617c915c9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index cf812a87..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "logo.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "logo-raywenderlich-1-300x300.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "logo-raywenderlich-1-300x300-1.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300-1.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300-1.png deleted file mode 100644 index 78c9342007d739b965bdbfa4307b0ddf021bd854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9867 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo-raywenderlich-1-300x300.png deleted file mode 100644 index 78c9342007d739b965bdbfa4307b0ddf021bd854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9867 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo.png b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Assets.xcassets/LaunchImage.imageset/logo.png deleted file mode 100644 index 78c9342007d739b965bdbfa4307b0ddf021bd854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9867 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreen.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index bca468fe..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreenDev.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreenDev.storyboard deleted file mode 100644 index 27a876dd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/LaunchScreenDev.storyboard +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/Main.storyboard b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Info.plist b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Info.plist deleted file mode 100644 index 9065509e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - WonderWords - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - wonder_words - 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 - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Runner-Bridging-Header.h b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/l10n.yaml deleted file mode 100644 index 657c2873..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/l10n.yaml +++ /dev/null @@ -1,5 +0,0 @@ -arb-dir: lib/l10n -template-arb-file: messages_en.arb -#output-localization-file: app_localizations.dart -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/home_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/home_screen.dart deleted file mode 100644 index 573ae1f7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/home_screen.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:wonder_words/l10n/app_localizations.dart'; - -class HomeScreen extends StatelessWidget { - const HomeScreen({ - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context); - final tabState = CupertinoTabPage.of(context); - - return CupertinoTabScaffold( - controller: tabState.controller, - tabBuilder: tabState.tabBuilder, - tabBar: CupertinoTabBar( - items: [ - BottomNavigationBarItem( - label: l10n.quotesBottomNavigationBarItemLabel, - icon: const Icon( - Icons.format_quote, - ), - ), - BottomNavigationBarItem( - label: l10n.profileBottomNavigationBarItemLabel, - icon: const Icon( - Icons.person, - ), - ), - ], - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations.dart deleted file mode 100644 index 393bd5c2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations.dart +++ /dev/null @@ -1,137 +0,0 @@ - -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'app_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. -/// -/// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/app_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: AppLocalizations.localizationsDelegates, -/// supportedLocales: AppLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the AppLocalizations.supportedLocales -/// property. -abstract class AppLocalizations { - AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static AppLocalizations of(BuildContext context) { - return Localizations.of(context, AppLocalizations)!; - } - - static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [ - Locale('en') - ]; - - /// No description provided for @quotesBottomNavigationBarItemLabel. - /// - /// In en, this message translates to: - /// **'Quotes'** - String get quotesBottomNavigationBarItemLabel; - - /// No description provided for @profileBottomNavigationBarItemLabel. - /// - /// In en, this message translates to: - /// **'Profile'** - String get profileBottomNavigationBarItemLabel; -} - -class _AppLocalizationsDelegate extends LocalizationsDelegate { - const _AppLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture(lookupAppLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_AppLocalizationsDelegate old) => false; -} - -AppLocalizations lookupAppLocalizations(Locale locale) { - - - // Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': return AppLocalizationsEn(); - } - - throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.' - ); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations_en.dart deleted file mode 100644 index 0f76c873..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/app_localizations_en.dart +++ /dev/null @@ -1,15 +0,0 @@ - - - -import 'app_localizations.dart'; - -/// The translations for English (`en`). -class AppLocalizationsEn extends AppLocalizations { - AppLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get quotesBottomNavigationBarItemLabel => 'Quotes'; - - @override - String get profileBottomNavigationBarItemLabel => 'Profile'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/messages_en.arb deleted file mode 100644 index 093b3e75..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/l10n/messages_en.arb +++ /dev/null @@ -1,4 +0,0 @@ -{ - "quotesBottomNavigationBarItemLabel": "Quotes", - "profileBottomNavigationBarItemLabel": "Profile" -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/main.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/main.dart deleted file mode 100644 index 41ebf968..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/main.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'dart:async'; -import 'dart:isolate'; - -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:key_value_storage/key_value_storage.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/l10n/app_localizations.dart'; -import 'package:wonder_words/routes.dart'; -import 'package:wonder_words/screen_view_observer.dart'; - -void main() async { - // Has to be late so it doesn't instantiate before the - // `initializeMonitoringPackage()` call. - late final errorReportingService = ErrorReportingService(); - - runZonedGuarded>( - () async { - WidgetsFlutterBinding.ensureInitialized(); - await initializeMonitoringPackage(); - - final remoteValueService = RemoteValueService(); - await remoteValueService.load(); - - FlutterError.onError = errorReportingService.recordFlutterError; - - Isolate.current.addErrorListener( - RawReceivePort((pair) async { - final List errorAndStacktrace = pair; - await errorReportingService.recordError( - errorAndStacktrace.first, - errorAndStacktrace.last, - ); - }).sendPort, - ); - - runApp( - WonderWords( - remoteValueService: remoteValueService, - ), - ); - }, - (error, stack) => errorReportingService.recordError( - error, - stack, - fatal: true, - ), - ); -} - -class WonderWords extends StatefulWidget { - const WonderWords({ - required this.remoteValueService, - Key? key, - }) : super(key: key); - - final RemoteValueService remoteValueService; - - @override - _WonderWordsState createState() => _WonderWordsState(); -} - -class _WonderWordsState extends State { - final _keyValueStorage = KeyValueStorage(); - final _analyticsService = AnalyticsService(); - final _dynamicLinkService = DynamicLinkService(); - late final _favQsApi = FavQsApi( - userTokenSupplier: () => _userRepository.getUserToken(), - ); - late final _quoteRepository = QuoteRepository( - remoteApi: _favQsApi, - keyValueStorage: _keyValueStorage, - ); - late final _userRepository = UserRepository( - remoteApi: _favQsApi, - noSqlStorage: _keyValueStorage, - ); - late final _navigator = RoutemasterDelegate( - observers: [ - ScreenViewObserver( - analyticsService: _analyticsService, - ), - ], - routesBuilder: (context) => Routes( - navigator: _navigator, - userRepository: _userRepository, - quoteRepository: _quoteRepository, - remoteValueService: widget.remoteValueService, - dynamicLinkService: _dynamicLinkService, - ), - ); - final _lightTheme = LightWonderThemeData(); - final _darkTheme = DarkWonderThemeData(); - - @override - void initState() { - super.initState(); - _openInitialDynamicLinkIfAny(); - - _dynamicLinkService.setListener( - (String path) => _navigator.push, - ); - } - - Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); - if (path != null) { - _navigator.push(path); - } - } - - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: _userRepository.getDarkModePreference(), - builder: (context, snapshot) { - final darkModePreference = snapshot.data; - return WonderTheme( - lightTheme: _lightTheme, - darkTheme: _darkTheme, - child: MaterialApp.router( - theme: _lightTheme.materialThemeData, - darkTheme: _darkTheme.materialThemeData, - themeMode: darkModePreference?.toThemeMode(), - localizationsDelegates: const [ - AppLocalizations.delegate, - ComponentLibraryLocalizations.delegate, - ProfileMenuLocalizations.delegate, - QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, - SignInLocalizations.delegate, - ForgotMyPasswordLocalizations.delegate, - SignUpLocalizations.delegate, - UpdateProfileLocalizations.delegate, - ], - routerDelegate: _navigator, - routeInformationParser: const RoutemasterParser(), - ), - ); - }, - ); - } -} - -extension on DarkModePreference { - ThemeMode toThemeMode() { - switch (this) { - case DarkModePreference.useSystemSettings: - return ThemeMode.system; - case DarkModePreference.alwaysLight: - return ThemeMode.light; - case DarkModePreference.alwaysDark: - return ThemeMode.dark; - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/routes.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/routes.dart deleted file mode 100644 index 124b8468..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/routes.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:forgot_my_password/forgot_my_password.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:routemaster/routemaster.dart'; -import 'package:sign_in/sign_in.dart'; -import 'package:sign_up/sign_up.dart'; -import 'package:update_profile/update_profile.dart'; -import 'package:user_repository/user_repository.dart'; -import 'package:wonder_words/home_screen.dart'; - -class Routes extends RouteMap { - Routes({ - required RoutemasterDelegate navigator, - required UserRepository userRepository, - required QuoteRepository quoteRepository, - required RemoteValueService remoteValueService, - required DynamicLinkService dynamicLinkService, - }) : super( - routes: { - _RoutePaths.homePath: (_) => CupertinoTabPage( - child: const HomeScreen(), - paths: [ - _RoutePaths.quoteListPath, - _RoutePaths.profileMenuPath, - ], - ), - _RoutePaths.quoteListPath: (route) { - return MaterialPage( - name: 'quotes-list', - child: QuoteListScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onAuthenticationError: (context) { - navigator.push(_RoutePaths.signInPath); - }, - onQuoteSelected: (id) { - final navigation = navigator.push( - _RoutePaths.quoteDetailsPath( - quoteId: id, - ), - ); - return navigation.result; - }, - remoteValueService: remoteValueService, - ), - ); - }, - _RoutePaths.profileMenuPath: (_) { - return MaterialPage( - name: 'profile-menu', - child: ProfileMenuScreen( - quoteRepository: quoteRepository, - userRepository: userRepository, - onSignInTap: () { - navigator.push( - _RoutePaths.signInPath, - ); - }, - onSignUpTap: () { - navigator.push( - _RoutePaths.signUpPath, - ); - }, - onUpdateProfileTap: () { - navigator.push( - _RoutePaths.updateProfilePath, - ); - }, - ), - ); - }, - _RoutePaths.updateProfilePath: (_) => MaterialPage( - name: 'update-profile', - child: UpdateProfileScreen( - userRepository: userRepository, - onUpdateProfileSuccess: () { - navigator.pop(); - }, - ), - ), - _RoutePaths.quoteDetailsPath(): (info) { - return MaterialPage( - name: 'quote-details', - child: QuoteDetailsScreen( - quoteRepository: quoteRepository, - quoteId: int.parse( - info.pathParameters[_RoutePaths.idPathParameter] ?? '', - ), - onAuthenticationError: () { - navigator.push(_RoutePaths.signInPath); - }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _RoutePaths.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), - ), - ); - }, - _RoutePaths.signInPath: (_) => MaterialPage( - name: 'sign-in', - fullscreenDialog: true, - child: Builder( - builder: (context) { - return SignInScreen( - userRepository: userRepository, - onSignInSuccess: () { - navigator.pop(); - }, - onSignUpTap: () { - navigator.push(_RoutePaths.signUpPath); - }, - onForgotMyPasswordTap: () { - showDialog( - context: context, - builder: (context) { - return ForgotMyPasswordDialog( - userRepository: userRepository, - onCancelTap: () { - navigator.pop(); - }, - onEmailRequestSuccess: () { - navigator.pop(); - }, - ); - }, - ); - }, - ); - }, - ), - ), - _RoutePaths.signUpPath: (_) => MaterialPage( - name: 'sign-up', - child: SignUpScreen( - userRepository: userRepository, - onSignUpSuccess: () async { - await navigator.pop(); - navigator.pop(); - }, - ), - ), - }, - ); -} - -class _RoutePaths { - const _RoutePaths._(); - - static String get homePath => '/'; - - static String get quoteListPath => '${homePath}quotes'; - - static String get profileMenuPath => '${homePath}user'; - - static String get updateProfilePath => '$profileMenuPath/update-profile'; - - static String get signInPath => '${homePath}sign-in'; - - static String get signUpPath => '${homePath}sign-up'; - - static String get idPathParameter => 'id'; - - static String quoteDetailsPath({ - int? quoteId, - }) => - '$quoteListPath/${quoteId ?? ':$idPathParameter'}'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/screen_view_observer.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/screen_view_observer.dart deleted file mode 100644 index ad8e53a3..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/lib/screen_view_observer.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:routemaster/routemaster.dart'; - -class ScreenViewObserver extends RoutemasterObserver { - ScreenViewObserver({ - required this.analyticsService, - }); - - final AnalyticsService analyticsService; - - void _sendScreenView(PageRoute route) { - final String? screenName = route.settings.name; - - if (screenName != null) { - analyticsService.setCurrentScreen(screenName); - } - } - - @override - void didPush(Route route, Route? previousRoute) { - super.didPush(route, previousRoute); - if (route is PageRoute) { - _sendScreenView(route); - } - } - - @override - void didPop(Route route, Route? previousRoute) { - super.didPop(route, previousRoute); - if (previousRoute is PageRoute && route is PageRoute) { - _sendScreenView(previousRoute); - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/makefile b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/makefile deleted file mode 100644 index dd578f08..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/makefile +++ /dev/null @@ -1,109 +0,0 @@ -PACKAGES := $(wildcard packages/*) -FEATURES := $(wildcard packages/features/*) -BUILD-RUNNER := packages/fav_qs_api packages/key_value_storage - -print: - for feature in $(FEATURES); do \ - echo $${feature} ; \ - done - for package in $(PACKAGES); do \ - echo $${package} ; \ - done - -pods-clean: - rm -Rf ios/Pods ; \ - rm -Rf ios/.symlinks ; \ - rm -Rf ios/Flutter/Flutter.framework ; \ - rm -Rf ios/Flutter/Flutter.podspec ; \ - rm ios/Podfile ; \ - rm ios/Podfile.lock ; \ - - -get: - flutter pub get - for feature in $(FEATURES); do \ - cd $${feature} ; \ - echo "Updating dependencies on $${feature}" ; \ - flutter pub get ; \ - cd ../../../ ; \ - done - for package in $(PACKAGES); do \ - cd $${package} ; \ - echo "Updating dependencies on $${package}" ; \ - flutter pub get ; \ - cd ../../ ; \ - done - -upgrade: - flutter pub upgrade - for feature in $(FEATURES); do \ - cd $${feature} ; \ - echo "Updating dependencies on $${feature}" ; \ - flutter pub upgrade ; \ - cd ../../../ ; \ - done - for package in $(PACKAGES); do \ - cd $${package} ; \ - echo "Updating dependencies on $${package}" ; \ - flutter pub upgrade ; \ - cd ../../ ; \ - done - -lint: - flutter analyze - -format: - flutter format --set-exit-if-changed . - -testing: - flutter test - for feature in $(FEATURES); do \ - cd $${feature} ; \ - echo "Running test on $${feature}" ; \ - flutter test ; \ - cd ../../../ ; \ - done - for package in $(PACKAGES); do \ - cd $${package} ; \ - echo "Running test on $${package}" ; \ - flutter test ; \ - cd ../../ ; \ - done - -test-coverage: - flutter test --coverage - for feature in $(FEATURES); do \ - cd $${feature} ; \ - echo "Running test on $${feature}" ; \ - flutter test --coverage ; \ - cd ../../../ ; \ - done - for package in $(PACKAGES); do \ - cd $${package} ; \ - echo "Running test on $${package}" ; \ - flutter test --coverage ; \ - cd ../../ ; \ - done - -clean: - flutter clean - for feature in $(FEATURES); do \ - cd $${feature} ; \ - echo "Running clean on $${feature}" ; \ - flutter clean ; \ - cd ../../../ ; \ - done - for package in $(PACKAGES); do \ - cd $${package} ; \ - echo "Running clean on $${package}" ; \ - flutter clean ; \ - cd ../../ ; \ - done - -build-runner: - for package in $(BUILD-RUNNER); do \ - cd $${package} ; \ - echo "Running build-runner on $${package}" ; \ - flutter pub run build_runner build --delete-conflicting-outputs ; \ - cd ../../ ; \ - done \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/Fondamento-Regular.ttf b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/Fondamento-Regular.ttf deleted file mode 100644 index d0489b2934f853cb018a2e0c8ca3010ded0bb44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87160 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 Mni8}LEYKz8$Z>pcz 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 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/closing-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/closing-quote.svg deleted file mode 100644 index 3fc052ab..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/closing-quote.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/opening-quote.svg b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/opening-quote.svg deleted file mode 100644 index 22973965..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/assets/opening-quote.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -Created with Sketch. - - - - - - diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/l10n.yaml deleted file mode 100644 index 81dd4432..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: component_library_localizations.dart -output-class: ComponentLibraryLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/component_library.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/component_library.dart deleted file mode 100644 index 90c09be6..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/component_library.dart +++ /dev/null @@ -1,24 +0,0 @@ -export 'src/chevron_list_tile.dart'; -export 'src/count_indicator_icon_button.dart'; -export 'src/downvote_icon_button.dart'; -export 'src/exception_indicator.dart'; -export 'src/expanded_elevated_button.dart'; -export 'src/in_progress_text_button.dart'; -export 'src/favorite_icon_button.dart'; -export 'src/l10n/component_library_localizations.dart'; -export 'src/quote_card.dart'; -export 'src/centered_circular_progress_indicator.dart'; -export 'src/rounded_choice_chip.dart'; -export 'src/generic_error_snack_bar.dart'; -export 'src/authentication_required_error_snack_bar.dart'; -export 'src/row_app_bar.dart'; -export 'src/search_bar.dart'; -export 'src/share_icon_button.dart'; -export 'src/shrinkable_text.dart'; -export 'src/styled_status_bar.dart'; -export 'src/svg_asset.dart'; -export 'src/theme/font_size.dart'; -export 'src/theme/spacing.dart'; -export 'src/theme/wonder_theme.dart'; -export 'src/theme/wonder_theme_data.dart'; -export 'src/upvote_icon_button.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/authentication_required_error_snack_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/authentication_required_error_snack_bar.dart deleted file mode 100644 index df9f08cd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/authentication_required_error_snack_bar.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class AuthenticationRequiredErrorSnackBar extends SnackBar { - const AuthenticationRequiredErrorSnackBar({Key? key}) - : super( - key: key, - content: const _AuthenticationRequiredErrorSnackBarMessage(), - ); -} - -class _AuthenticationRequiredErrorSnackBarMessage extends StatelessWidget { - const _AuthenticationRequiredErrorSnackBarMessage({Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return Text( - l10n.authenticationRequiredErrorSnackbarMessage, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/centered_circular_progress_indicator.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/centered_circular_progress_indicator.dart deleted file mode 100644 index d152abe4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/centered_circular_progress_indicator.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/material.dart'; - -class CenteredCircularProgressIndicator extends StatelessWidget { - const CenteredCircularProgressIndicator({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return const Center( - child: CircularProgressIndicator(), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/chevron_list_tile.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/chevron_list_tile.dart deleted file mode 100644 index 45a66a69..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/chevron_list_tile.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:component_library/src/theme/font_size.dart'; -import 'package:flutter/material.dart'; - -class ChevronListTile extends StatelessWidget { - const ChevronListTile({ - required this.label, - this.onTap, - Key? key, - }) : super(key: key); - - final String label; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - title: Text( - label, - style: const TextStyle( - fontSize: FontSize.mediumLarge, - ), - ), - trailing: const Icon( - Icons.chevron_right_outlined, - ), - onTap: onTap, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/count_indicator_icon_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/count_indicator_icon_button.dart deleted file mode 100644 index 66558e26..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/count_indicator_icon_button.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class CountIndicatorIconButton extends StatelessWidget { - const CountIndicatorIconButton({ - required this.count, - required this.iconData, - this.iconColor, - this.tooltip, - this.onTap, - Key? key, - }) : super(key: key); - - final int count; - final IconData iconData; - final Color? iconColor; - final String? tooltip; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return IconButton( - onPressed: onTap, - tooltip: tooltip, - padding: const EdgeInsets.all(0), - icon: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - iconData, - color: iconColor, - ), - Text( - count.toString(), - style: const TextStyle( - fontSize: FontSize.small, - ), - ), - ], - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/downvote_icon_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/downvote_icon_button.dart deleted file mode 100644 index ccb721bd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/downvote_icon_button.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class DownvoteIconButton extends StatelessWidget { - const DownvoteIconButton({ - required this.count, - required this.isDownvoted, - this.onTap, - Key? key, - }) : super(key: key); - - final int count; - final VoidCallback? onTap; - final bool isDownvoted; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - final theme = WonderTheme.of(context); - return CountIndicatorIconButton( - onTap: onTap, - tooltip: l10n.downvoteIconButtonTooltip, - iconData: Icons.arrow_downward_sharp, - iconColor: - isDownvoted ? theme.votedButtonColor : theme.unvotedButtonColor, - count: count, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/exception_indicator.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/exception_indicator.dart deleted file mode 100644 index f7d79c2f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/exception_indicator.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class ExceptionIndicator extends StatelessWidget { - const ExceptionIndicator({ - this.title, - this.message, - this.onTryAgain, - Key? key, - }) : super(key: key); - - final String? title; - final String? message; - final VoidCallback? onTryAgain; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return Center( - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 32, - horizontal: 16, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( - Icons.error, - size: 48, - ), - const SizedBox( - height: Spacing.xxLarge, - ), - Text( - title ?? l10n.exceptionIndicatorGenericTitle, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: FontSize.mediumLarge, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 16, - ), - Text( - title ?? l10n.exceptionIndicatorGenericMessage, - textAlign: TextAlign.center, - ), - if (onTryAgain != null) - const SizedBox( - height: Spacing.xxxLarge, - ), - if (onTryAgain != null) - ExpandedElevatedButton( - onTap: onTryAgain, - icon: const Icon( - Icons.refresh, - ), - label: l10n.exceptionIndicatorTryAgainButton, - ), - ], - ), - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/expanded_elevated_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/expanded_elevated_button.dart deleted file mode 100644 index e2cf33f0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/expanded_elevated_button.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -class ExpandedElevatedButton extends StatelessWidget { - static const double _elevatedButtonHeight = 48; - - const ExpandedElevatedButton({ - required this.label, - this.onTap, - this.icon, - Key? key, - }) : super(key: key); - - ExpandedElevatedButton.inProgress({ - required String label, - Key? key, - }) : this( - label: label, - icon: Transform.scale( - scale: 0.5, - child: const CircularProgressIndicator(), - ), - key: key, - ); - - final VoidCallback? onTap; - final String label; - final Widget? icon; - - @override - Widget build(BuildContext context) { - final icon = this.icon; - return SizedBox( - height: _elevatedButtonHeight, - width: double.infinity, - child: icon != null - ? ElevatedButton.icon( - onPressed: onTap, - label: Text( - label, - ), - icon: icon, - ) - : ElevatedButton( - onPressed: onTap, - child: Text( - label, - ), - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/favorite_icon_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/favorite_icon_button.dart deleted file mode 100644 index 44092c1d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/favorite_icon_button.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class FavoriteIconButton extends StatelessWidget { - const FavoriteIconButton({ - required this.isFavorite, - this.onTap, - Key? key, - }) : super(key: key); - - final bool isFavorite; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return IconButton( - onPressed: onTap, - tooltip: l10n.favoriteIconButtonTooltip, - icon: Icon( - isFavorite ? Icons.favorite : Icons.favorite_border_outlined, - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/generic_error_snack_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/generic_error_snack_bar.dart deleted file mode 100644 index fdd12f2e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/generic_error_snack_bar.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class GenericErrorSnackBar extends SnackBar { - const GenericErrorSnackBar({Key? key}) - : super( - key: key, - content: const _GenericErrorSnackBarMessage(), - ); -} - -class _GenericErrorSnackBarMessage extends StatelessWidget { - const _GenericErrorSnackBarMessage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return Text( - l10n.genericErrorSnackbarMessage, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/in_progress_text_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/in_progress_text_button.dart deleted file mode 100644 index b8143ca7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/in_progress_text_button.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; - -class InProgressTextButton extends StatelessWidget { - const InProgressTextButton({ - required this.label, - Key? key, - }) : super(key: key); - - final String label; - - @override - Widget build(BuildContext context) { - return TextButton.icon( - icon: Transform.scale( - scale: 0.5, - child: const CircularProgressIndicator(), - ), - label: Text( - label, - ), - onPressed: null, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations.dart deleted file mode 100644 index c4a9b358..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ /dev/null @@ -1,194 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'component_library_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned -/// by `ComponentLibraryLocalizations.of(context)`. -/// -/// Applications need to include `ComponentLibraryLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/component_library_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: ComponentLibraryLocalizations.localizationsDelegates, -/// supportedLocales: ComponentLibraryLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the ComponentLibraryLocalizations.supportedLocales -/// property. -abstract class ComponentLibraryLocalizations { - ComponentLibraryLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static ComponentLibraryLocalizations of(BuildContext context) { - return Localizations.of( - context, ComponentLibraryLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _ComponentLibraryLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @downvoteIconButtonTooltip. - /// - /// In en, this message translates to: - /// **'Downvote'** - String get downvoteIconButtonTooltip; - - /// No description provided for @upvoteIconButtonTooltip. - /// - /// In en, this message translates to: - /// **'Upvote'** - String get upvoteIconButtonTooltip; - - /// No description provided for @searchBarHintText. - /// - /// In en, this message translates to: - /// **'journey'** - String get searchBarHintText; - - /// No description provided for @searchBarLabelText. - /// - /// In en, this message translates to: - /// **'Search'** - String get searchBarLabelText; - - /// No description provided for @shareIconButtonTooltip. - /// - /// In en, this message translates to: - /// **'Share'** - String get shareIconButtonTooltip; - - /// No description provided for @favoriteIconButtonTooltip. - /// - /// In en, this message translates to: - /// **'Favorite'** - String get favoriteIconButtonTooltip; - - /// No description provided for @exceptionIndicatorGenericTitle. - /// - /// In en, this message translates to: - /// **'Something went wrong'** - String get exceptionIndicatorGenericTitle; - - /// No description provided for @exceptionIndicatorTryAgainButton. - /// - /// In en, this message translates to: - /// **'Try Again'** - String get exceptionIndicatorTryAgainButton; - - /// No description provided for @exceptionIndicatorGenericMessage. - /// - /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** - String get exceptionIndicatorGenericMessage; - - /// No description provided for @genericErrorSnackbarMessage. - /// - /// In en, this message translates to: - /// **'There has been an error. Please, check your internet connection.'** - String get genericErrorSnackbarMessage; - - /// No description provided for @authenticationRequiredErrorSnackbarMessage. - /// - /// In en, this message translates to: - /// **'You need to sign in before performing this action.'** - String get authenticationRequiredErrorSnackbarMessage; -} - -class _ComponentLibraryLocalizationsDelegate - extends LocalizationsDelegate { - const _ComponentLibraryLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; -} - -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( - Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return ComponentLibraryLocalizationsEn(); - } - - throw FlutterError( - 'ComponentLibraryLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations_en.dart deleted file mode 100644 index 6bc7ade3..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'component_library_localizations.dart'; - -/// The translations for English (`en`). -class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { - ComponentLibraryLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get downvoteIconButtonTooltip => 'Downvote'; - - @override - String get upvoteIconButtonTooltip => 'Upvote'; - - @override - String get searchBarHintText => 'journey'; - - @override - String get searchBarLabelText => 'Search'; - - @override - String get shareIconButtonTooltip => 'Share'; - - @override - String get favoriteIconButtonTooltip => 'Favorite'; - - @override - String get exceptionIndicatorGenericTitle => 'Something went wrong'; - - @override - String get exceptionIndicatorTryAgainButton => 'Try Again'; - - @override - String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; - - @override - String get genericErrorSnackbarMessage => - 'There has been an error. Please, check your internet connection.'; - - @override - String get authenticationRequiredErrorSnackbarMessage => - 'You need to sign in before performing this action.'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/messages_en.arb deleted file mode 100644 index e2b441e7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,13 +0,0 @@ -{ - "downvoteIconButtonTooltip": "Downvote", - "upvoteIconButtonTooltip": "Upvote", - "searchBarHintText": "journey", - "searchBarLabelText": "Search", - "shareIconButtonTooltip": "Share", - "favoriteIconButtonTooltip": "Favorite", - "exceptionIndicatorGenericTitle": "Something went wrong", - "exceptionIndicatorTryAgainButton": "Try Again", - "exceptionIndicatorGenericMessage": "There has been an error.\nPlease, check your internet connection and try again later.", - "genericErrorSnackbarMessage": "There has been an error. Please, check your internet connection.", - "authenticationRequiredErrorSnackbarMessage": "You need to sign in before performing this action." -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/quote_card.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/quote_card.dart deleted file mode 100644 index 0975e7d0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/quote_card.dart +++ /dev/null @@ -1,92 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; -import 'package:flutter/material.dart'; - -class QuoteCard extends StatelessWidget { - const QuoteCard({ - required this.statement, - required this.isFavorite, - this.author, - this.top, - this.bottom, - this.onTap, - this.onFavorite, - Key? key, - }) : super(key: key); - - final String statement; - final String? author; - final bool isFavorite; - final Widget? top; - final Widget? bottom; - final VoidCallback? onTap; - final VoidCallback? onFavorite; - - @override - Widget build(BuildContext context) { - final top = this.top; - final bottom = this.bottom; - final theme = WonderTheme.of(context); - final author = this.author; - return Card( - margin: const EdgeInsets.all(0), - child: InkWell( - onTap: onTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Row( - children: [ - if (top != null) - Padding( - padding: const EdgeInsets.only( - left: Spacing.medium, - ), - child: top, - ), - const Spacer(), - IconButton( - onPressed: onFavorite, - icon: Icon( - isFavorite - ? Icons.favorite - : Icons.favorite_border_outlined, - ), - ) - ], - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.xLarge, - ), - child: Text( - statement, - style: theme.quoteTextStyle.copyWith( - fontSize: FontSize.large, - ), - ), - ), - if (bottom != null) - Padding( - padding: const EdgeInsets.only( - right: Spacing.medium, - ), - child: bottom, - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - if (author != null) - Padding( - padding: const EdgeInsets.only( - bottom: Spacing.medium, - right: Spacing.medium, - ), - child: Text(author), - ), - ], - ), - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/rounded_choice_chip.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/rounded_choice_chip.dart deleted file mode 100644 index 46806b51..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/rounded_choice_chip.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class RoundedChoiceChip extends StatelessWidget { - const RoundedChoiceChip({ - required this.label, - required this.isSelected, - this.avatar, - this.labelColor, - this.selectedLabelColor, - this.backgroundColor, - this.selectedBackgroundColor, - this.onSelected, - Key? key, - }) : super(key: key); - - final String label; - final Widget? avatar; - final ValueChanged? onSelected; - final Color? labelColor; - final Color? selectedLabelColor; - final Color? backgroundColor; - final Color? selectedBackgroundColor; - final bool isSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return ChoiceChip( - shape: const StadiumBorder( - side: BorderSide(), - ), - avatar: avatar, - label: Text( - label, - style: TextStyle( - color: isSelected - ? (selectedLabelColor ?? - theme.roundedChoiceChipSelectedLabelColor) - : (labelColor ?? theme.roundedChoiceChipLabelColor), - ), - ), - onSelected: onSelected, - selected: isSelected, - backgroundColor: - (backgroundColor ?? theme.roundedChoiceChipBackgroundColor), - selectedColor: (selectedBackgroundColor ?? - theme.roundedChoiceChipSelectedBackgroundColor), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/row_app_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/row_app_bar.dart deleted file mode 100644 index dc83aeda..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/row_app_bar.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; -import 'package:flutter/material.dart'; - -class RowAppBar extends StatelessWidget implements PreferredSizeWidget { - const RowAppBar({ - Key? key, - this.children = const [], - }) : super(key: key); - - final List children; - - @override - Widget build(BuildContext context) { - return SafeArea( - child: Padding( - padding: const EdgeInsets.only( - top: Spacing.small, - left: Spacing.small, - right: Spacing.small, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const BackButton(), - ...children, - ], - ), - ), - ); - } - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/search_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/search_bar.dart deleted file mode 100644 index 151a4ac8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/search_bar.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; - -class SearchBar extends StatelessWidget { - const SearchBar({ - this.controller, - this.onChanged, - Key? key, - }) : super(key: key); - - final TextEditingController? controller; - final ValueChanged? onChanged; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return TextField( - controller: controller, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.search, - ), - hintText: l10n.searchBarHintText, - labelText: l10n.searchBarLabelText, - ), - onChanged: onChanged, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/share_icon_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/share_icon_button.dart deleted file mode 100644 index 7f80490d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/share_icon_button.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class ShareIconButton extends StatelessWidget { - const ShareIconButton({ - Key? key, - this.onTap, - }) : super(key: key); - - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - return IconButton( - onPressed: onTap, - tooltip: l10n.shareIconButtonTooltip, - icon: const Icon( - Icons.share, - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/shrinkable_text.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/shrinkable_text.dart deleted file mode 100644 index 3c317889..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/shrinkable_text.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/material.dart'; - -class ShrinkableText extends StatelessWidget { - const ShrinkableText( - this.data, { - this.style, - this.textAlign = TextAlign.center, - Key? key, - }) : super(key: key); - - final String data; - final TextStyle? style; - final TextAlign? textAlign; - - @override - Widget build(BuildContext context) { - return AutoSizeText( - data, - style: style, - textAlign: textAlign, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/styled_status_bar.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/styled_status_bar.dart deleted file mode 100644 index ff361ace..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/styled_status_bar.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// Useful for changing the status bar color when the screen doesn't have an -// AppBar. For screens with AppBars, please use the [] property. -class StyledStatusBar extends StatelessWidget { - const StyledStatusBar._({ - required this.child, - required this.style, - Key? key, - }) : super(key: key); - - const StyledStatusBar.light({ - required Widget child, - Key? key, - }) : this._( - child: child, - style: SystemUiOverlayStyle.light, - key: key, - ); - - const StyledStatusBar.dark({ - required Widget child, - Key? key, - }) : this._( - child: child, - style: SystemUiOverlayStyle.dark, - key: key, - ); - - final Widget child; - final SystemUiOverlayStyle style; - - @override - Widget build(BuildContext context) { - return AnnotatedRegion( - value: style, - child: child, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/svg_asset.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/svg_asset.dart deleted file mode 100644 index d707332e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/svg_asset.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:component_library/src/theme/wonder_theme.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -class _SvgAsset extends StatelessWidget { - const _SvgAsset( - this.assetPath, { - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final String assetPath; - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - return SvgPicture.asset( - 'assets/$assetPath', - width: width, - height: height, - color: color, - package: 'component_library', - ); - } -} - -class OpeningQuoteSvgAsset extends StatelessWidget { - const OpeningQuoteSvgAsset({ - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return _SvgAsset( - 'opening-quote.svg', - width: width, - height: height, - color: theme.quoteSvgColor, - ); - } -} - -class ClosingQuoteSvgAsset extends StatelessWidget { - const ClosingQuoteSvgAsset({ - this.width, - this.height, - this.color, - Key? key, - }) : super(key: key); - - final double? width; - final double? height; - final Color? color; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return _SvgAsset( - 'closing-quote.svg', - width: width, - height: height, - color: theme.quoteSvgColor, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/font_size.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/font_size.dart deleted file mode 100644 index 0bd0d1df..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/font_size.dart +++ /dev/null @@ -1,8 +0,0 @@ -abstract class FontSize { - static const double small = 11; - static const double medium = 14; - static const double mediumLarge = 18; - static const double large = 22; - static const double xLarge = 64; - static const double xxLarge = 192; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/spacing.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/spacing.dart deleted file mode 100644 index 9fa87701..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/spacing.dart +++ /dev/null @@ -1,10 +0,0 @@ -abstract class Spacing { - static const double xSmall = 4; - static const double small = 8; - static const double medium = 12; - static const double mediumLarge = 16; - static const double large = 20; - static const double xLarge = 24; - static const double xxLarge = 48; - static const double xxxLarge = 64; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme.dart deleted file mode 100644 index 79d43d57..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:component_library/src/theme/wonder_theme_data.dart'; -import 'package:flutter/material.dart'; - -class WonderTheme extends InheritedWidget { - const WonderTheme({ - required Widget child, - required this.lightTheme, - required this.darkTheme, - Key? key, - }) : super( - key: key, - child: child, - ); - - final WonderThemeData lightTheme; - final WonderThemeData darkTheme; - - @override - bool updateShouldNotify( - WonderTheme oldWidget, - ) => - oldWidget.lightTheme != lightTheme || oldWidget.darkTheme != darkTheme; - - static WonderThemeData of(BuildContext context) { - final WonderTheme? inheritedTheme = - context.dependOnInheritedWidgetOfExactType(); - assert(inheritedTheme != null, 'No WonderTheme found in context'); - final currentBrightness = Theme.of(context).brightness; - return currentBrightness == Brightness.dark - ? inheritedTheme!.darkTheme - : inheritedTheme!.lightTheme; - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme_data.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme_data.dart deleted file mode 100644 index fab49c3f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/theme/wonder_theme_data.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; -import 'package:flutter/material.dart'; - -const _dividerThemeData = DividerThemeData( - space: 0, -); - -// If the number of properties get too big, we can start grouping them in -// classes like Flutter does with TextTheme, ButtonTheme, etc, inside ThemeData. -abstract class WonderThemeData { - ThemeData get materialThemeData; - - double screenMargin = Spacing.mediumLarge; - - double gridSpacing = Spacing.mediumLarge; - - Color get roundedChoiceChipBackgroundColor; - - Color get roundedChoiceChipSelectedBackgroundColor; - - Color get roundedChoiceChipLabelColor; - - Color get roundedChoiceChipSelectedLabelColor; - - Color get roundedChoiceChipAvatarColor; - - Color get roundedChoiceChipSelectedAvatarColor; - - Color get quoteSvgColor; - - Color get unvotedButtonColor; - - Color get votedButtonColor; - - TextStyle quoteTextStyle = const TextStyle( - fontFamily: 'Fondamento', - package: 'component_library', - ); -} - -class LightWonderThemeData extends WonderThemeData { - @override - ThemeData get materialThemeData => ThemeData( - brightness: Brightness.light, - primarySwatch: Colors.black.toMaterialColor(), - dividerTheme: _dividerThemeData, - ); - - @override - Color get roundedChoiceChipBackgroundColor => Colors.white; - - @override - Color get roundedChoiceChipLabelColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedBackgroundColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedLabelColor => Colors.white; - - @override - Color get quoteSvgColor => Colors.black; - - @override - Color get roundedChoiceChipAvatarColor => Colors.black; - - @override - Color get roundedChoiceChipSelectedAvatarColor => Colors.white; - - @override - Color get unvotedButtonColor => Colors.black54; - - @override - Color get votedButtonColor => Colors.black; -} - -class DarkWonderThemeData extends WonderThemeData { - @override - ThemeData get materialThemeData => ThemeData( - brightness: Brightness.dark, - toggleableActiveColor: Colors.white, - primarySwatch: Colors.white.toMaterialColor(), - dividerTheme: _dividerThemeData, - ); - - @override - Color get roundedChoiceChipBackgroundColor => Colors.black; - - @override - Color get roundedChoiceChipLabelColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedBackgroundColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedLabelColor => Colors.black; - - @override - Color get quoteSvgColor => Colors.white; - - @override - Color get roundedChoiceChipAvatarColor => Colors.white; - - @override - Color get roundedChoiceChipSelectedAvatarColor => Colors.black; - - @override - Color get unvotedButtonColor => Colors.white54; - - @override - Color get votedButtonColor => Colors.white; -} - -extension on Color { - Map _toSwatch() => { - 50: withOpacity(0.1), - 100: withOpacity(0.2), - 200: withOpacity(0.3), - 300: withOpacity(0.4), - 400: withOpacity(0.5), - 500: withOpacity(0.6), - 600: withOpacity(0.7), - 700: withOpacity(0.8), - 800: withOpacity(0.9), - 900: this, - }; - - MaterialColor toMaterialColor() => MaterialColor( - value, - _toSwatch(), - ); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/upvote_icon_button.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/upvote_icon_button.dart deleted file mode 100644 index 06a28adf..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/lib/src/upvote_icon_button.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; - -class UpvoteIconButton extends StatelessWidget { - const UpvoteIconButton({ - required this.count, - required this.isUpvoted, - this.onTap, - Key? key, - }) : super(key: key); - - final int count; - final bool isUpvoted; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - final l10n = ComponentLibraryLocalizations.of(context); - final theme = WonderTheme.of(context); - return CountIndicatorIconButton( - onTap: onTap, - tooltip: l10n.upvoteIconButtonTooltip, - iconData: Icons.arrow_upward_sharp, - iconColor: isUpvoted ? theme.votedButtonColor : theme.unvotedButtonColor, - count: count, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/pubspec.yaml deleted file mode 100644 index d75f7082..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: component_library -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - intl: ^0.17.0 - flutter_svg: ^0.22.0 - auto_size_text: ^3.0.0-nullsafety.0 - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - generate: true - assets: - - assets/ - fonts: - - family: Fondamento - fonts: - - asset: assets/Fondamento-Regular.ttf \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/component_library/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/domain_models.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/domain_models.dart deleted file mode 100644 index 2338f870..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/domain_models.dart +++ /dev/null @@ -1,8 +0,0 @@ -export 'src/dark_mode_preference.dart'; -export 'src/dark_mode_preference.dart'; -export 'src/exceptions.dart'; -export 'src/quote.dart'; -export 'src/quote_list_page.dart'; -export 'src/tag.dart'; -export 'src/user.dart'; -export 'src/user.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/dark_mode_preference.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/dark_mode_preference.dart deleted file mode 100644 index 9e9ebb61..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/dark_mode_preference.dart +++ /dev/null @@ -1 +0,0 @@ -enum DarkModePreference { alwaysDark, alwaysLight, useSystemSettings } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/exceptions.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/exceptions.dart deleted file mode 100644 index 8079ff07..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/exceptions.dart +++ /dev/null @@ -1,9 +0,0 @@ -class EmptySearchResultException implements Exception {} - -class UserAuthenticationRequiredException implements Exception {} - -class InvalidCredentialsException implements Exception {} - -class UsernameAlreadyTakenException implements Exception {} - -class EmailAlreadyRegisteredException implements Exception {} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote.dart deleted file mode 100644 index 2d90d92e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class Quote extends Equatable { - const Quote({ - required this.id, - required this.body, - required this.favoritesCount, - required this.upvotesCount, - required this.downvotesCount, - this.author, - this.isFavorite, - this.isUpvoted, - this.isDownvoted, - }); - - final int id; - final String body; - final String? author; - final bool? isFavorite; - final bool? isUpvoted; - final bool? isDownvoted; - final int favoritesCount; - final int upvotesCount; - final int downvotesCount; - - @override - List get props => [ - id, - body, - author, - isFavorite, - isUpvoted, - isDownvoted, - favoritesCount, - upvotesCount, - downvotesCount, - ]; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote_list_page.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote_list_page.dart deleted file mode 100644 index 935b9f46..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/quote_list_page.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; - -class QuoteListPage extends Equatable { - const QuoteListPage({ - required this.isLastPage, - required this.quoteList, - }); - - final bool isLastPage; - final List quoteList; - - @override - List get props => [ - isLastPage, - quoteList, - ]; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/tag.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/tag.dart deleted file mode 100644 index 96a10229..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/tag.dart +++ /dev/null @@ -1 +0,0 @@ -enum Tag { life, happiness, work, nature, science, love, funny } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/user.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/user.dart deleted file mode 100644 index 9223e7d7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/lib/src/user.dart +++ /dev/null @@ -1,9 +0,0 @@ -class User { - User({ - required this.username, - required this.email, - }); - - final String username; - final String email; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/pubspec.yaml deleted file mode 100644 index b09f3aa3..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/pubspec.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: domain_models -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - equatable: ^2.0.3 - -dev_dependencies: - lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/domain_models/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/build.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/build.yaml deleted file mode 100644 index 55a4ef5b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/build.yaml +++ /dev/null @@ -1,6 +0,0 @@ -targets: - $default: - builders: - json_serializable: - options: - checked: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/fav_qs_api.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/fav_qs_api.dart deleted file mode 100644 index 400d6518..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/fav_qs_api.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'src/fav_qs_api.dart'; -export 'src/models/exceptions.dart'; -export 'src/models/models.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/fav_qs_api.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/fav_qs_api.dart deleted file mode 100644 index 3681556c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ /dev/null @@ -1,235 +0,0 @@ -import 'package:dio/dio.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; -import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; -import 'package:fav_qs_api/src/url_builder.dart'; -import 'package:meta/meta.dart'; - -import 'models/models.dart'; - -typedef UserTokenSupplier = Future Function(); - -class FavQsApi { - static const _errorCodeJsonKey = 'error_code'; - static const _errorMessageJsonKey = 'message'; - - FavQsApi({ - required UserTokenSupplier userTokenSupplier, - @visibleForTesting Dio? dio, - @visibleForTesting UrlBuilder? urlBuilder, - }) : _dio = dio ?? Dio(), - _urlBuilder = urlBuilder ?? const UrlBuilder() { - _dio.setUpAuthHeaders(userTokenSupplier); - _dio.interceptors.add( - LogInterceptor(responseBody: false), - ); - } - - final Dio _dio; - final UrlBuilder _urlBuilder; - - Future getQuoteListPage( - int page, { - String? tag, - String searchTerm = '', - String? favoritedByUsername, - }) async { - final url = _urlBuilder.buildGetQuoteListPageUrl( - page, - tag: tag, - searchTerm: searchTerm, - favoritedByUsername: favoritedByUsername, - ); - final response = await _dio.get(url); - final jsonObject = response.data; - final quoteListPage = QuoteListPageRM.fromJson(jsonObject); - final firstItem = quoteListPage.quoteList.first; - if (firstItem.id == 0) { - throw EmptySearchResultFavQsException(); - } - return quoteListPage; - } - - Future getQuote(int id) async { - final url = _urlBuilder.buildGetQuoteUrl(id); - final response = await _dio.get(url); - final jsonObject = response.data; - final quote = QuoteRM.fromJson(jsonObject); - return quote; - } - - Future favoriteQuote(int id) async { - final url = _urlBuilder.buildFavoriteQuoteUrl(id); - return _updateQuote(url); - } - - Future unfavoriteQuote(int id) async { - final url = _urlBuilder.buildUnfavoriteQuoteUrl(id); - return _updateQuote(url); - } - - Future upvoteQuote(int id) async { - final url = _urlBuilder.buildUpvoteQuoteUrl(id); - return _updateQuote(url); - } - - Future downvoteQuote(int id) async { - final url = _urlBuilder.buildDownvoteQuoteUrl(id); - return _updateQuote(url); - } - - Future unvoteQuote(int id) async { - final url = _urlBuilder.buildUnvoteQuoteUrl(id); - return _updateQuote(url); - } - - Future _updateQuote(String url) async { - final response = await _dio.put(url); - final jsonObject = response.data; - try { - final quote = QuoteRM.fromJson(jsonObject); - return quote; - } catch (error) { - final int errorCode = jsonObject[_errorCodeJsonKey]; - if (errorCode == 20) { - throw UserAuthRequiredFavQsException(); - } - rethrow; - } - } - - Future signIn(String email, String password) async { - final url = _urlBuilder.buildSignInUrl(); - final requestJsonBody = SignInRequestRM( - credentials: UserCredentialsRM( - email: email, - password: password, - ), - ).toJson(); - final response = await _dio.post( - url, - data: requestJsonBody, - ); - final jsonObject = response.data; - try { - final user = UserRM.fromJson(jsonObject); - return user; - } catch (error) { - final int errorCode = jsonObject[_errorCodeJsonKey]; - if (errorCode == 21) { - throw InvalidCredentialsFavQsException(); - } - rethrow; - } - } - - Future signUp(String username, String email, String password) async { - final url = _urlBuilder.buildSignUpUrl(); - final requestJsonBody = SignUpRequestRM( - user: UserInfoRM( - username: username, - email: email, - password: password, - ), - ).toJson(); - final response = await _dio.post( - url, - data: requestJsonBody, - ); - final jsonObject = response.data; - try { - return jsonObject['User-Token']; - } catch (error) { - final int errorCode = jsonObject[_errorCodeJsonKey]; - if (errorCode == 32) { - final String errorMessage = jsonObject[_errorMessageJsonKey]; - if (errorMessage.toLowerCase().contains('email')) { - throw EmailAlreadyRegisteredFavQsException(); - } else { - throw UsernameAlreadyTakenFavQsException(); - } - } - rethrow; - } - } - - Future updateProfile( - String username, - String email, - String? password, - ) async { - final url = _urlBuilder.buildUpdateProfileUrl(username); - final requestJsonBody = UpdateUserRequestRM( - user: UserInfoRM( - username: username, - email: email, - password: password, - ), - ).toJson(); - final response = await _dio.put( - url, - data: requestJsonBody, - ); - final Map jsonObject = response.data; - if (jsonObject.containsKey(_errorCodeJsonKey)) { - final int errorCode = jsonObject[_errorCodeJsonKey]; - if (errorCode == 32) { - throw UsernameAlreadyTakenFavQsException(); - } - } - } - - Future signOut() async { - final url = _urlBuilder.buildSignOutUrl(); - await _dio.delete(url); - } - - Future requestPasswordResetEmail(String email) async { - final url = _urlBuilder.buildRequestPasswordResetEmailUrl(); - try { - await _dio.post( - url, - data: PasswordResetEmailRequestRM( - user: UserEmailRM( - email: email, - ), - ), - ); - } on DioError catch (error) { - // When an unregistered email is sent to the API, it returns 404. - // That can be considered a security breach, so we prefer handling an - // unregistered email just like a registered one. - if (error.response?.statusCode == 404) { - return; - } - rethrow; - } - } -} - -extension on Dio { - static const _appTokenEnvironmentVariableKey = 'fav-qs-app-token'; - - void setUpAuthHeaders(UserTokenSupplier userTokenSupplier) { - final appToken = const String.fromEnvironment( - _appTokenEnvironmentVariableKey, - ); - options = BaseOptions(headers: { - 'Authorization': 'Token token=$appToken', - }); - interceptors.add( - InterceptorsWrapper( - onRequest: (options, handler) async { - String? userToken = await userTokenSupplier(); - if (userToken != null) { - options.headers.addAll({ - 'User-Token': userToken, - }); - } - return handler.next(options); - }, - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/exceptions.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/exceptions.dart deleted file mode 100644 index 806aa9e0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/exceptions.dart +++ /dev/null @@ -1,9 +0,0 @@ -class EmptySearchResultFavQsException implements Exception {} - -class UserAuthRequiredFavQsException implements Exception {} - -class InvalidCredentialsFavQsException implements Exception {} - -class UsernameAlreadyTakenFavQsException implements Exception {} - -class EmailAlreadyRegisteredFavQsException implements Exception {} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/models.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/models.dart deleted file mode 100644 index 9cad0b78..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/models.dart +++ /dev/null @@ -1,11 +0,0 @@ -export 'request/password_reset_email_request_rm.dart'; -export 'request/sign_in_request_rm.dart'; -export 'request/sign_up_request_rm.dart'; -export 'request/update_user_request_rm.dart'; -export 'request/user_credentials_rm.dart'; -export 'request/user_email_rm.dart'; -export 'request/user_info_rm.dart'; -export 'response/quote_list_page_rm.dart'; -export 'response/quote_rm.dart'; -export 'response/quote_user_info_rm.dart'; -export 'response/user_rm.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.dart deleted file mode 100644 index e0e0e1a5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'password_reset_email_request_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class PasswordResetEmailRequestRM { - const PasswordResetEmailRequestRM({ - required this.user, - }); - - @JsonKey(name: 'user') - final UserEmailRM user; - - Map toJson() => _$PasswordResetEmailRequestRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.g.dart deleted file mode 100644 index 0fc4a54a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/password_reset_email_request_rm.g.dart +++ /dev/null @@ -1,13 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'password_reset_email_request_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$PasswordResetEmailRequestRMToJson( - PasswordResetEmailRequestRM instance) => - { - 'user': instance.user, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.dart deleted file mode 100644 index fbef7de3..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:fav_qs_api/src/models/request/user_credentials_rm.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'sign_in_request_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class SignInRequestRM { - const SignInRequestRM({ - required this.credentials, - }); - - @JsonKey(name: 'user') - final UserCredentialsRM credentials; - - Map toJson() => _$SignInRequestRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.g.dart deleted file mode 100644 index db57b8f7..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_in_request_rm.g.dart +++ /dev/null @@ -1,12 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'sign_in_request_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$SignInRequestRMToJson(SignInRequestRM instance) => - { - 'user': instance.credentials, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.dart deleted file mode 100644 index 918d2fbd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'sign_up_request_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class SignUpRequestRM { - const SignUpRequestRM({ - required this.user, - }); - - @JsonKey(name: 'user') - final UserInfoRM user; - - Map toJson() => _$SignUpRequestRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.g.dart deleted file mode 100644 index fb9a840c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/sign_up_request_rm.g.dart +++ /dev/null @@ -1,12 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'sign_up_request_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$SignUpRequestRMToJson(SignUpRequestRM instance) => - { - 'user': instance.user, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.dart deleted file mode 100644 index 418a7a11..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'update_user_request_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class UpdateUserRequestRM { - const UpdateUserRequestRM({ - required this.user, - }); - - @JsonKey(name: 'user') - final UserInfoRM user; - - Map toJson() => _$UpdateUserRequestRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.g.dart deleted file mode 100644 index 89173a75..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/update_user_request_rm.g.dart +++ /dev/null @@ -1,13 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'update_user_request_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$UpdateUserRequestRMToJson( - UpdateUserRequestRM instance) => - { - 'user': instance.user, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.dart deleted file mode 100644 index 05cb9e12..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'user_credentials_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class UserCredentialsRM { - const UserCredentialsRM({ - required this.email, - required this.password, - }); - - @JsonKey(name: 'login') - final String email; - @JsonKey(name: 'password') - final String password; - - Map toJson() => _$UserCredentialsRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.g.dart deleted file mode 100644 index c191352a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_credentials_rm.g.dart +++ /dev/null @@ -1,13 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_credentials_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$UserCredentialsRMToJson(UserCredentialsRM instance) => - { - 'login': instance.email, - 'password': instance.password, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.dart deleted file mode 100644 index fcc3a0f0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'user_email_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class UserEmailRM { - const UserEmailRM({ - required this.email, - }); - - @JsonKey(name: 'email') - final String email; - - Map toJson() => _$UserEmailRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.g.dart deleted file mode 100644 index 7936bfab..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_email_rm.g.dart +++ /dev/null @@ -1,12 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_email_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$UserEmailRMToJson(UserEmailRM instance) => - { - 'email': instance.email, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.dart deleted file mode 100644 index 471367c2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'user_info_rm.g.dart'; - -@JsonSerializable(createFactory: false) -class UserInfoRM { - const UserInfoRM({ - required this.username, - required this.email, - required this.password, - }); - - @JsonKey(name: 'login') - final String username; - @JsonKey(name: 'email') - final String email; - @JsonKey(name: 'password') - final String? password; - - Map toJson() => _$UserInfoRMToJson(this); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.g.dart deleted file mode 100644 index d92396be..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/request/user_info_rm.g.dart +++ /dev/null @@ -1,14 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_info_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$UserInfoRMToJson(UserInfoRM instance) => - { - 'login': instance.username, - 'email': instance.email, - 'password': instance.password, - }; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.dart deleted file mode 100644 index de289783..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:fav_qs_api/src/models/response/quote_rm.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'quote_list_page_rm.g.dart'; - -@JsonSerializable(createToJson: false) -class QuoteListPageRM { - const QuoteListPageRM({ - required this.isLastPage, - required this.quoteList, - }); - - @JsonKey(name: 'last_page') - final bool isLastPage; - @JsonKey(name: 'quotes') - final List quoteList; - - static const fromJson = _$QuoteListPageRMFromJson; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart deleted file mode 100644 index 563ddeac..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_list_page_rm.g.dart +++ /dev/null @@ -1,22 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quote_list_page_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -QuoteListPageRM _$QuoteListPageRMFromJson(Map json) { - return $checkedNew('QuoteListPageRM', json, () { - final val = QuoteListPageRM( - isLastPage: $checkedConvert(json, 'last_page', (v) => v as bool), - quoteList: $checkedConvert( - json, - 'quotes', - (v) => (v as List) - .map((e) => QuoteRM.fromJson(e as Map)) - .toList()), - ); - return val; - }, fieldKeyMap: const {'isLastPage': 'last_page', 'quoteList': 'quotes'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.dart deleted file mode 100644 index 235e5431..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:fav_qs_api/src/models/response/quote_user_info_rm.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'quote_rm.g.dart'; - -@JsonSerializable(createToJson: false) -class QuoteRM { - const QuoteRM({ - required this.id, - required this.body, - required this.favoritesCount, - required this.upvotesCount, - required this.downvotesCount, - this.author, - this.userInfo, - }); - - final int id; - final String? body; - final String? author; - @JsonKey(name: 'user_details') - final QuoteUserInfoRM? userInfo; - @JsonKey(name: 'favorites_count', defaultValue: 0) - final int favoritesCount; - @JsonKey(name: 'upvotes_count', defaultValue: 0) - final int upvotesCount; - @JsonKey(name: 'downvotes_count', defaultValue: 0) - final int downvotesCount; - - static const fromJson = _$QuoteRMFromJson; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart deleted file mode 100644 index a3dfa67c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_rm.g.dart +++ /dev/null @@ -1,35 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quote_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -QuoteRM _$QuoteRMFromJson(Map json) { - return $checkedNew('QuoteRM', json, () { - final val = QuoteRM( - id: $checkedConvert(json, 'id', (v) => v as int), - body: $checkedConvert(json, 'body', (v) => v as String?), - favoritesCount: - $checkedConvert(json, 'favorites_count', (v) => v as int?) ?? 0, - upvotesCount: - $checkedConvert(json, 'upvotes_count', (v) => v as int?) ?? 0, - downvotesCount: - $checkedConvert(json, 'downvotes_count', (v) => v as int?) ?? 0, - author: $checkedConvert(json, 'author', (v) => v as String?), - userInfo: $checkedConvert( - json, - 'user_details', - (v) => v == null - ? null - : QuoteUserInfoRM.fromJson(v as Map)), - ); - return val; - }, fieldKeyMap: const { - 'favoritesCount': 'favorites_count', - 'upvotesCount': 'upvotes_count', - 'downvotesCount': 'downvotes_count', - 'userInfo': 'user_details' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.dart deleted file mode 100644 index 51020b2b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'quote_user_info_rm.g.dart'; - -@JsonSerializable(createToJson: false) -class QuoteUserInfoRM { - const QuoteUserInfoRM({ - required this.isFavorite, - required this.isUpvoted, - required this.isDownvoted, - }); - - @JsonKey(name: 'favorite') - final bool isFavorite; - @JsonKey(name: 'upvote') - final bool isUpvoted; - @JsonKey(name: 'downvote') - final bool isDownvoted; - - static const fromJson = _$QuoteUserInfoRMFromJson; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart deleted file mode 100644 index 847bfd47..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/quote_user_info_rm.g.dart +++ /dev/null @@ -1,22 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quote_user_info_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -QuoteUserInfoRM _$QuoteUserInfoRMFromJson(Map json) { - return $checkedNew('QuoteUserInfoRM', json, () { - final val = QuoteUserInfoRM( - isFavorite: $checkedConvert(json, 'favorite', (v) => v as bool), - isUpvoted: $checkedConvert(json, 'upvote', (v) => v as bool), - isDownvoted: $checkedConvert(json, 'downvote', (v) => v as bool), - ); - return val; - }, fieldKeyMap: const { - 'isFavorite': 'favorite', - 'isUpvoted': 'upvote', - 'isDownvoted': 'downvote' - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.dart deleted file mode 100644 index d4e3d384..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'user_rm.g.dart'; - -@JsonSerializable(createToJson: false) -class UserRM { - const UserRM({ - required this.token, - required this.username, - required this.email, - }); - - @JsonKey(name: 'User-Token') - final String token; - @JsonKey(name: 'login') - final String username; - @JsonKey(name: 'email') - final String email; - - static const fromJson = _$UserRMFromJson; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart deleted file mode 100644 index 083f8ae8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/models/response/user_rm.g.dart +++ /dev/null @@ -1,18 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user_rm.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -UserRM _$UserRMFromJson(Map json) { - return $checkedNew('UserRM', json, () { - final val = UserRM( - token: $checkedConvert(json, 'User-Token', (v) => v as String), - username: $checkedConvert(json, 'login', (v) => v as String), - email: $checkedConvert(json, 'email', (v) => v as String), - ); - return val; - }, fieldKeyMap: const {'token': 'User-Token', 'username': 'login'}); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/url_builder.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/url_builder.dart deleted file mode 100644 index 1d4877ad..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/lib/src/url_builder.dart +++ /dev/null @@ -1,73 +0,0 @@ -class UrlBuilder { - const UrlBuilder({ - String? baseUrl, - }) : _baseUrl = baseUrl ?? 'https://favqs.com/api'; - - final String _baseUrl; - - String buildGetQuoteListPageUrl( - int page, { - String? tag, - String searchTerm = '', - String? favoritedByUsername, - }) { - assert( - (tag == null && searchTerm.isEmpty) || - (searchTerm.isEmpty && favoritedByUsername == null) || - (favoritedByUsername == null && tag == null), - 'FavQs doesn\'t support filtering favorites or searching by both query and ' - 'tag at the same time.'); - - final tagQueryStringPart = tag != null ? '&filter=$tag&type=tag' : ''; - final favoriteQueryStringPart = favoritedByUsername != null - ? '&filter=$favoritedByUsername&type=user' - : ''; - final searchQueryStringPart = - searchTerm.isNotEmpty ? '&filter=$searchTerm' : ''; - return '$_baseUrl/quotes/?page=$page$tagQueryStringPart$searchQueryStringPart$favoriteQueryStringPart'; - } - - String buildGetQuoteUrl(int id) { - return '$_baseUrl/quotes/$id'; - } - - String buildFavoriteQuoteUrl(int id) { - return '$_baseUrl/quotes/$id/fav'; - } - - String buildUnfavoriteQuoteUrl(int id) { - return '$_baseUrl/quotes/$id/unfav'; - } - - String buildUpvoteQuoteUrl(int id) { - return '$_baseUrl/quotes/$id/upvote'; - } - - String buildDownvoteQuoteUrl(int id) { - return '$_baseUrl/quotes/$id/downvote'; - } - - String buildUnvoteQuoteUrl(int id) { - return '$_baseUrl/quotes/$id/clearvote'; - } - - String buildSignInUrl() { - return '$_baseUrl/session'; - } - - String buildSignOutUrl() { - return '$_baseUrl/session'; - } - - String buildSignUpUrl() { - return '$_baseUrl/users'; - } - - String buildUpdateProfileUrl(String username) { - return '$_baseUrl/users/$username'; - } - - String buildRequestPasswordResetEmailUrl() { - return '$_baseUrl/users/forgot_password'; - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/pubspec.yaml deleted file mode 100644 index 4ba8e5da..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/pubspec.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: fav_qs_api -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - dio: ^4.0.0 - equatable: ^2.0.3 - json_annotation: ^4.0.1 - -dev_dependencies: - mocktail: 0.1.4 - build_runner: ^2.0.5 - json_serializable: ^4.1.3 - test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/fav_qs_api/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/l10n.yaml deleted file mode 100644 index 61cb1962..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: forgot_my_password_localizations.dart -output-class: ForgotMyPasswordLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/forgot_my_password.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/forgot_my_password.dart deleted file mode 100644 index a42f5493..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/forgot_my_password.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/forgot_my_password_dialog.dart'; -export 'src/l10n/forgot_my_password_localizations.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart deleted file mode 100644 index f40a9e51..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_cubit.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'forgot_my_password_state.dart'; - -class ForgotMyPasswordCubit extends Cubit { - ForgotMyPasswordCubit({ - required this.userRepository, - }) : super( - const ForgotMyPasswordState(), - ); - - final UserRepository userRepository; - - void onEmailChanged(String newValue) { - final previousValue = state.email; - final shouldValidate = previousValue.invalid; - final newState = state.copyWith( - email: shouldValidate - ? Email.validated( - newValue, - isAlreadyRegistered: newValue == previousValue.value - ? previousValue.isAlreadyRegistered - : false, - ) - : Email.unvalidated( - newValue, - ), - ); - - emit(newState); - } - - void onEmailUnfocused() { - final newState = state.copyWith( - email: Email.validated( - state.email.value, - ), - ); - emit(newState); - } - - void onSubmit() async { - final email = Email.validated(state.email.value); - final newState = state.copyWith( - email: email, - submissionStatus: email.valid ? SubmissionStatus.inProgress : null, - ); - emit(newState); - if (email.valid) { - try { - await userRepository.requestPasswordResetEmail( - email.value, - ); - final newState = state.copyWith( - submissionStatus: SubmissionStatus.success, - ); - emit(newState); - } catch (_) { - final newState = state.copyWith( - submissionStatus: SubmissionStatus.error, - ); - emit(newState); - } - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart deleted file mode 100644 index 4be5eef2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_dialog.dart +++ /dev/null @@ -1,162 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:forgot_my_password/src/forgot_my_password_cubit.dart'; -import 'package:forgot_my_password/src/l10n/forgot_my_password_localizations.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:user_repository/user_repository.dart'; - -class ForgotMyPasswordDialog extends StatelessWidget { - const ForgotMyPasswordDialog({ - required this.userRepository, - required this.onCancelTap, - required this.onEmailRequestSuccess, - Key? key, - }) : super(key: key); - - final UserRepository userRepository; - final VoidCallback onCancelTap; - final VoidCallback onEmailRequestSuccess; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => ForgotMyPasswordCubit( - userRepository: userRepository, - ), - child: ForgotMyPasswordView( - onCancelTap: onCancelTap, - onEmailRequestSuccess: onEmailRequestSuccess, - ), - ); - } -} - -@visibleForTesting -class ForgotMyPasswordView extends StatefulWidget { - const ForgotMyPasswordView({ - required this.onCancelTap, - required this.onEmailRequestSuccess, - Key? key, - }) : super(key: key); - - final VoidCallback onCancelTap; - final VoidCallback onEmailRequestSuccess; - - @override - _ForgotMyPasswordViewState createState() => _ForgotMyPasswordViewState(); -} - -class _ForgotMyPasswordViewState extends State { - final _emailFocusNode = FocusNode(); - - @override - void initState() { - super.initState(); - _emailFocusNode.addListener(() { - if (!_emailFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onEmailUnfocused(); - } - }); - } - - @override - Widget build(BuildContext context) { - final l10n = ForgotMyPasswordLocalizations.of(context); - return BlocConsumer( - listener: (context, state) { - if (state.submissionStatus == SubmissionStatus.success) { - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar( - SnackBar( - content: Text( - l10n.emailRequestSuccessMessage, - ), - duration: const Duration( - seconds: 8, - ), - ), - ); - widget.onEmailRequestSuccess(); - return; - } - }, - builder: (context, state) { - final cubit = context.read(); - final isSubmissionInProgress = - state.submissionStatus == SubmissionStatus.inProgress; - final emailError = state.email.invalid ? state.email.error : null; - return GestureDetector( - onTap: () => _releaseFocus(context), - child: AlertDialog( - title: Text(l10n.dialogTitle), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - focusNode: _emailFocusNode, - enabled: !isSubmissionInProgress, - onEditingComplete: cubit.onSubmit, - onChanged: cubit.onEmailChanged, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.alternate_email, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null - ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : l10n.emailTextFieldInvalidErrorMessage), - ), - ), - if (state.submissionStatus == SubmissionStatus.error) ...[ - const SizedBox( - height: Spacing.medium, - ), - Text( - l10n.errorMessage, - style: const TextStyle( - color: Colors.red, - fontSize: FontSize.medium, - ), - ), - ], - ], - ), - actions: [ - TextButton( - onPressed: isSubmissionInProgress ? null : widget.onCancelTap, - child: Text( - l10n.cancelButtonLabel, - ), - ), - isSubmissionInProgress - ? InProgressTextButton( - label: l10n.confirmButtonLabel, - ) - : TextButton( - onPressed: cubit.onSubmit, - child: Text( - l10n.confirmButtonLabel, - ), - ) - ], - ), - ); - }, - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); - - @override - void dispose() { - _emailFocusNode.dispose(); - super.dispose(); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart deleted file mode 100644 index 333d7041..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/forgot_my_password_state.dart +++ /dev/null @@ -1,35 +0,0 @@ -part of 'forgot_my_password_cubit.dart'; - -class ForgotMyPasswordState extends Equatable { - const ForgotMyPasswordState({ - this.email = const Email.unvalidated(), - this.submissionStatus = SubmissionStatus.idle, - }); - - final Email email; - final SubmissionStatus submissionStatus; - - ForgotMyPasswordState copyWith({ - Email? email, - Password? password, - SubmissionStatus? submissionStatus, - }) { - return ForgotMyPasswordState( - email: email ?? this.email, - submissionStatus: submissionStatus ?? this.submissionStatus, - ); - } - - @override - List get props => [ - email, - submissionStatus, - ]; -} - -enum SubmissionStatus { - idle, - inProgress, - success, - error, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart deleted file mode 100644 index f4d70e95..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ /dev/null @@ -1,176 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'forgot_my_password_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned -/// by `ForgotMyPasswordLocalizations.of(context)`. -/// -/// Applications need to include `ForgotMyPasswordLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/forgot_my_password_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: ForgotMyPasswordLocalizations.localizationsDelegates, -/// supportedLocales: ForgotMyPasswordLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the ForgotMyPasswordLocalizations.supportedLocales -/// property. -abstract class ForgotMyPasswordLocalizations { - ForgotMyPasswordLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static ForgotMyPasswordLocalizations of(BuildContext context) { - return Localizations.of( - context, ForgotMyPasswordLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _ForgotMyPasswordLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @dialogTitle. - /// - /// In en, this message translates to: - /// **'Forgot My Password'** - String get dialogTitle; - - /// No description provided for @emailTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Email'** - String get emailTextFieldLabel; - - /// No description provided for @emailTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your email can\'t be empty.'** - String get emailTextFieldEmptyErrorMessage; - - /// No description provided for @emailTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is not valid.'** - String get emailTextFieldInvalidErrorMessage; - - /// No description provided for @emailRequestSuccessMessage. - /// - /// In en, this message translates to: - /// **'If this email is registered in our systems, a link will be sent to you with instructions on how to reset your password.'** - String get emailRequestSuccessMessage; - - /// No description provided for @confirmButtonLabel. - /// - /// In en, this message translates to: - /// **'Confirm'** - String get confirmButtonLabel; - - /// No description provided for @cancelButtonLabel. - /// - /// In en, this message translates to: - /// **'Cancel'** - String get cancelButtonLabel; - - /// No description provided for @errorMessage. - /// - /// In en, this message translates to: - /// **'There has been an error. Please, check your internet connection.'** - String get errorMessage; -} - -class _ForgotMyPasswordLocalizationsDelegate - extends LocalizationsDelegate { - const _ForgotMyPasswordLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; -} - -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( - Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return ForgotMyPasswordLocalizationsEn(); - } - - throw FlutterError( - 'ForgotMyPasswordLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_en.dart deleted file mode 100644 index e8797081..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_en.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'forgot_my_password_localizations.dart'; - -/// The translations for English (`en`). -class ForgotMyPasswordLocalizationsEn extends ForgotMyPasswordLocalizations { - ForgotMyPasswordLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get dialogTitle => 'Forgot My Password'; - - @override - String get emailTextFieldLabel => 'Email'; - - @override - String get emailTextFieldEmptyErrorMessage => 'Your email can\'t be empty.'; - - @override - String get emailTextFieldInvalidErrorMessage => 'This email is not valid.'; - - @override - String get emailRequestSuccessMessage => - 'If this email is registered in our systems, a link will be sent to you with instructions on how to reset your password.'; - - @override - String get confirmButtonLabel => 'Confirm'; - - @override - String get cancelButtonLabel => 'Cancel'; - - @override - String get errorMessage => - 'There has been an error. Please, check your internet connection.'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/messages_en.arb deleted file mode 100644 index 957d07a9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "dialogTitle": "Forgot My Password", - "emailTextFieldLabel": "Email", - "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", - "emailTextFieldInvalidErrorMessage": "This email is not valid.", - "emailRequestSuccessMessage": "If this email is registered in our systems, a link will be sent to you with instructions on how to reset your password.", - "confirmButtonLabel": "Confirm", - "cancelButtonLabel": "Cancel", - "errorMessage": "There has been an error. Please, check your internet connection." -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/pubspec.yaml deleted file mode 100644 index fc6d79ab..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/pubspec.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: forgot_my_password -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - flutter_bloc: ^8.0.1 - flutter: - sdk: flutter - user_repository: - path: ../../user_repository - form_fields: - path: ../../form_fields - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/forgot_my_password/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/l10n.yaml deleted file mode 100644 index 4f11cc01..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: profile_menu_localizations.dart -output-class: ProfileMenuLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/profile_menu.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/profile_menu.dart deleted file mode 100644 index 06b5d506..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/profile_menu.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/profile_menu_localizations.dart'; -export 'src/profile_menu_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart deleted file mode 100644 index 57c37f4e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; - -class DarkModePreferencePicker extends StatelessWidget { - const DarkModePreferencePicker({ - required this.currentValue, - Key? key, - }) : super(key: key); - - final DarkModePreference currentValue; - - @override - Widget build(BuildContext context) { - final l10n = ProfileMenuLocalizations.of(context); - final bloc = context.read(); - return Column( - children: [ - ListTile( - title: Text( - l10n.darkModePreferencesHeaderTileLabel, - style: const TextStyle( - fontSize: FontSize.mediumLarge, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.center, - ), - ), - ...ListTile.divideTiles( - tiles: [ - RadioListTile( - title: Text( - l10n.darkModePreferencesAlwaysDarkTileLabel, - ), - value: DarkModePreference.alwaysDark, - groupValue: currentValue, - onChanged: (newOption) { - bloc.add( - const ProfileMenuDarkModePreferenceChanged( - DarkModePreference.alwaysDark, - ), - ); - }, - ), - RadioListTile( - title: Text( - l10n.darkModePreferencesAlwaysLightTileLabel, - ), - value: DarkModePreference.alwaysLight, - groupValue: currentValue, - onChanged: (newOption) { - bloc.add( - const ProfileMenuDarkModePreferenceChanged( - DarkModePreference.alwaysLight, - ), - ); - }, - ), - RadioListTile( - title: Text( - l10n.darkModePreferencesUseSystemSettingsTileLabel, - ), - value: DarkModePreference.useSystemSettings, - groupValue: currentValue, - onChanged: (newOption) { - bloc.add( - const ProfileMenuDarkModePreferenceChanged( - DarkModePreference.useSystemSettings, - ), - ); - }, - ), - ], - context: context, - ), - ], - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/messages_en.arb deleted file mode 100644 index 2089593b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,19 +0,0 @@ -{ - "signInButtonLabel": "Sign In", - "signedInUserGreeting": "Hi, {username}!", - "@signedInUserGreeting": { - "placeholders": { - "username": { - "type": "String" - } - } - }, - "updateProfileTileLabel": "Update Profile", - "darkModePreferencesHeaderTileLabel": "Dark Mode Preferences", - "darkModePreferencesAlwaysDarkTileLabel": "Always Dark", - "darkModePreferencesAlwaysLightTileLabel": "Always Light", - "darkModePreferencesUseSystemSettingsTileLabel": "Use System Settings", - "signOutButtonLabel": "Sign Out", - "signUpOpeningText": "Don't have an account?", - "signUpButtonLabel": "Sign up" -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart deleted file mode 100644 index dac7abf9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ /dev/null @@ -1,187 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'profile_menu_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned -/// by `ProfileMenuLocalizations.of(context)`. -/// -/// Applications need to include `ProfileMenuLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/profile_menu_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: ProfileMenuLocalizations.localizationsDelegates, -/// supportedLocales: ProfileMenuLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the ProfileMenuLocalizations.supportedLocales -/// property. -abstract class ProfileMenuLocalizations { - ProfileMenuLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static ProfileMenuLocalizations of(BuildContext context) { - return Localizations.of( - context, ProfileMenuLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _ProfileMenuLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @signInButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign In'** - String get signInButtonLabel; - - /// No description provided for @signedInUserGreeting. - /// - /// In en, this message translates to: - /// **'Hi, {username}!'** - String signedInUserGreeting(String username); - - /// No description provided for @updateProfileTileLabel. - /// - /// In en, this message translates to: - /// **'Update Profile'** - String get updateProfileTileLabel; - - /// No description provided for @darkModePreferencesHeaderTileLabel. - /// - /// In en, this message translates to: - /// **'Dark Mode Preferences'** - String get darkModePreferencesHeaderTileLabel; - - /// No description provided for @darkModePreferencesAlwaysDarkTileLabel. - /// - /// In en, this message translates to: - /// **'Always Dark'** - String get darkModePreferencesAlwaysDarkTileLabel; - - /// No description provided for @darkModePreferencesAlwaysLightTileLabel. - /// - /// In en, this message translates to: - /// **'Always Light'** - String get darkModePreferencesAlwaysLightTileLabel; - - /// No description provided for @darkModePreferencesUseSystemSettingsTileLabel. - /// - /// In en, this message translates to: - /// **'Use System Settings'** - String get darkModePreferencesUseSystemSettingsTileLabel; - - /// No description provided for @signOutButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign Out'** - String get signOutButtonLabel; - - /// No description provided for @signUpOpeningText. - /// - /// In en, this message translates to: - /// **'Don\'t have an account?'** - String get signUpOpeningText; - - /// No description provided for @signUpButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign up'** - String get signUpButtonLabel; -} - -class _ProfileMenuLocalizationsDelegate - extends LocalizationsDelegate { - const _ProfileMenuLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - lookupProfileMenuLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; -} - -ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { - // Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return ProfileMenuLocalizationsEn(); - } - - throw FlutterError( - 'ProfileMenuLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart deleted file mode 100644 index 098adb27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_en.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'profile_menu_localizations.dart'; - -/// The translations for English (`en`). -class ProfileMenuLocalizationsEn extends ProfileMenuLocalizations { - ProfileMenuLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get signInButtonLabel => 'Sign In'; - - @override - String signedInUserGreeting(String username) { - return 'Hi, $username!'; - } - - @override - String get updateProfileTileLabel => 'Update Profile'; - - @override - String get darkModePreferencesHeaderTileLabel => 'Dark Mode Preferences'; - - @override - String get darkModePreferencesAlwaysDarkTileLabel => 'Always Dark'; - - @override - String get darkModePreferencesAlwaysLightTileLabel => 'Always Light'; - - @override - String get darkModePreferencesUseSystemSettingsTileLabel => - 'Use System Settings'; - - @override - String get signOutButtonLabel => 'Sign Out'; - - @override - String get signUpOpeningText => 'Don\'t have an account?'; - - @override - String get signUpButtonLabel => 'Sign up'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_bloc.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_bloc.dart deleted file mode 100644 index 9c13427d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_bloc.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'profile_menu_event.dart'; - -part 'profile_menu_state.dart'; - -class ProfileMenuBloc extends Bloc { - ProfileMenuBloc({ - required this.userRepository, - required this.quoteRepository, - }) : super( - const ProfileMenuInProgress(), - ) { - on( - (_, emit) async { - await emit.onEach( - Rx.combineLatest2( - userRepository.getUser(), - userRepository.getDarkModePreference(), - (user, darkModePreference) => ProfileMenuLoaded( - darkModePreference: darkModePreference, - username: user?.username, - ), - ), - onData: emit, - ); - }, - transformer: (events, mapper) => events.flatMap( - mapper, - ), - ); - - on((_, emit) async { - final currentState = state as ProfileMenuLoaded; - final newState = currentState.copyWith( - isSignOutInProgress: true, - ); - - emit(newState); - - await userRepository.signOut(); - await quoteRepository.clearCache(); - }); - - on((event, _) async { - await userRepository.upsertDarkModePreference( - event.preference, - ); - }); - - add( - const ProfileMenuStarted(), - ); - } - - final UserRepository userRepository; - final QuoteRepository quoteRepository; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_event.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_event.dart deleted file mode 100644 index 0816f3a9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_event.dart +++ /dev/null @@ -1,29 +0,0 @@ -part of 'profile_menu_bloc.dart'; - -abstract class ProfileMenuEvent extends Equatable { - const ProfileMenuEvent(); - - @override - List get props => []; -} - -class ProfileMenuStarted extends ProfileMenuEvent { - const ProfileMenuStarted(); -} - -class ProfileMenuDarkModePreferenceChanged extends ProfileMenuEvent { - const ProfileMenuDarkModePreferenceChanged( - this.preference, - ); - - final DarkModePreference preference; - - @override - List get props => [ - preference, - ]; -} - -class ProfileMenuSignedOut extends ProfileMenuEvent { - const ProfileMenuSignedOut(); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_screen.dart deleted file mode 100644 index 2202ce36..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ /dev/null @@ -1,200 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:user_repository/user_repository.dart'; - -class ProfileMenuScreen extends StatelessWidget { - const ProfileMenuScreen({ - required this.userRepository, - required this.quoteRepository, - this.onSignInTap, - this.onSignUpTap, - this.onUpdateProfileTap, - Key? key, - }) : super(key: key); - - final VoidCallback? onSignInTap; - final VoidCallback? onUpdateProfileTap; - final VoidCallback? onSignUpTap; - final UserRepository userRepository; - final QuoteRepository quoteRepository; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => ProfileMenuBloc( - userRepository: userRepository, - quoteRepository: quoteRepository, - ), - child: ProfileMenuView( - onSignInTap: onSignInTap, - onUpdateProfileTap: onUpdateProfileTap, - onSignUpTap: onSignUpTap, - ), - ); - } -} - -@visibleForTesting -class ProfileMenuView extends StatelessWidget { - const ProfileMenuView({ - this.onSignInTap, - this.onSignUpTap, - this.onUpdateProfileTap, - Key? key, - }) : super(key: key); - - final VoidCallback? onSignInTap; - final VoidCallback? onSignUpTap; - final VoidCallback? onUpdateProfileTap; - - @override - Widget build(BuildContext context) { - final l10n = ProfileMenuLocalizations.of(context); - return StyledStatusBar.dark( - child: Scaffold( - body: SafeArea( - child: BlocBuilder( - builder: (context, state) { - if (state is ProfileMenuLoaded) { - final username = state.username; - return Column( - children: [ - if (!state.isUserAuthenticated) ...[ - _SignInButton( - onSignInTap: onSignInTap, - ), - const SizedBox( - height: Spacing.xLarge, - ), - Text( - l10n.signUpOpeningText, - ), - TextButton( - child: Text( - l10n.signUpButtonLabel, - ), - onPressed: onSignUpTap, - ), - const SizedBox( - height: Spacing.large, - ), - ], - if (username != null) ...[ - Expanded( - child: Center( - child: Padding( - padding: const EdgeInsets.all( - Spacing.small, - ), - child: ShrinkableText( - l10n.signedInUserGreeting(username), - style: const TextStyle( - fontSize: 36, - ), - ), - ), - ), - ), - const Divider(), - ChevronListTile( - label: l10n.updateProfileTileLabel, - onTap: onUpdateProfileTap, - ), - const Divider(), - const SizedBox( - height: Spacing.mediumLarge, - ), - ], - DarkModePreferencePicker( - currentValue: state.darkModePreference, - ), - if (state.isUserAuthenticated) ...[ - const Spacer(), - _SignOutButton( - isSignOutInProgress: state.isSignOutInProgress, - ), - ] - ], - ); - } else { - return const CenteredCircularProgressIndicator(); - } - }, - ), - ), - ), - ); - } -} - -class _SignInButton extends StatelessWidget { - const _SignInButton({ - Key? key, - this.onSignInTap, - }) : super(key: key); - - final VoidCallback? onSignInTap; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final l10n = ProfileMenuLocalizations.of(context); - return Padding( - padding: EdgeInsets.only( - left: theme.screenMargin, - right: theme.screenMargin, - top: Spacing.xxLarge, - ), - child: ExpandedElevatedButton( - onTap: onSignInTap, - label: l10n.signInButtonLabel, - icon: const Icon( - Icons.login, - ), - ), - ); - } -} - -class _SignOutButton extends StatelessWidget { - const _SignOutButton({ - required this.isSignOutInProgress, - Key? key, - }) : super(key: key); - - final bool isSignOutInProgress; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final l10n = ProfileMenuLocalizations.of(context); - return Padding( - padding: EdgeInsets.only( - left: theme.screenMargin, - right: theme.screenMargin, - bottom: Spacing.xLarge, - ), - child: isSignOutInProgress - ? ExpandedElevatedButton.inProgress( - label: l10n.signOutButtonLabel, - ) - : ExpandedElevatedButton( - onTap: () { - final bloc = context.read(); - bloc.add( - const ProfileMenuSignedOut(), - ); - }, - label: l10n.signOutButtonLabel, - icon: const Icon( - Icons.logout, - ), - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_state.dart deleted file mode 100644 index 70a60995..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/lib/src/profile_menu_state.dart +++ /dev/null @@ -1,45 +0,0 @@ -part of 'profile_menu_bloc.dart'; - -abstract class ProfileMenuState extends Equatable { - const ProfileMenuState(); - - @override - List get props => []; -} - -class ProfileMenuLoaded extends ProfileMenuState { - const ProfileMenuLoaded({ - this.darkModePreference = DarkModePreference.useSystemSettings, - this.isSignOutInProgress = false, - this.username, - }); - - final DarkModePreference darkModePreference; - final String? username; - final bool isSignOutInProgress; - - bool get isUserAuthenticated => username != null; - - ProfileMenuLoaded copyWith({ - DarkModePreference? darkModePreference, - String? username, - bool? isSignOutInProgress, - }) { - return ProfileMenuLoaded( - darkModePreference: darkModePreference ?? this.darkModePreference, - username: username ?? this.username, - isSignOutInProgress: isSignOutInProgress ?? this.isSignOutInProgress, - ); - } - - @override - List get props => [ - darkModePreference, - username, - isSignOutInProgress, - ]; -} - -class ProfileMenuInProgress extends ProfileMenuState { - const ProfileMenuInProgress(); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/pubspec.yaml deleted file mode 100644 index 8f33a7c1..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/pubspec.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: profile_menu -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - intl: ^0.17.0 - quote_repository: - path: ../../quote_repository - flutter_bloc: ^8.0.1 - user_repository: - path: ../../user_repository - domain_models: - path: ../../domain_models - rxdart: ^0.27.1 - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/profile_menu/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/quote_details.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/quote_details.dart deleted file mode 100644 index 3bc917fc..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/quote_details.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/quote_details_localizations.dart'; -export 'src/quote_details_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_cubit.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_cubit.dart deleted file mode 100644 index 597cc6ce..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_cubit.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_repository/quote_repository.dart'; - -part 'quote_details_state.dart'; - -class QuoteDetailsCubit extends Cubit { - QuoteDetailsCubit({ - required this.quoteId, - required this.quoteRepository, - }) : super( - const QuoteDetailsInProgress(), - ) { - _fetchQuoteDetails(); - } - - final int quoteId; - final QuoteRepository quoteRepository; - - Future _fetchQuoteDetails() async { - try { - final quote = await quoteRepository.getQuoteDetails(quoteId); - emit( - QuoteDetailsSuccess(quote: quote), - ); - } catch (error) { - emit( - const QuoteDetailsFailure(), - ); - } - } - - Future refetch() async { - emit( - const QuoteDetailsInProgress(), - ); - - _fetchQuoteDetails(); - } - - void upvoteQuote() async { - await _executeQuoteUpdateOperation( - () => quoteRepository.upvoteQuote(quoteId), - ); - } - - void downvoteQuote() async { - await _executeQuoteUpdateOperation( - () => quoteRepository.downvoteQuote(quoteId), - ); - } - - void unvoteQuote() async { - await _executeQuoteUpdateOperation( - () => quoteRepository.unvoteQuote(quoteId), - ); - } - - void favoriteQuote() async { - await _executeQuoteUpdateOperation( - () => quoteRepository.favoriteQuote(quoteId), - ); - } - - void unfavoriteQuote() async { - await _executeQuoteUpdateOperation( - () => quoteRepository.unfavoriteQuote(quoteId), - ); - } - - Future _executeQuoteUpdateOperation( - Future Function() updateQuote, - ) async { - try { - final updatedQuote = await updateQuote(); - emit( - QuoteDetailsSuccess( - quote: updatedQuote, - ), - ); - } catch (error) { - final lastState = state; - if (lastState is QuoteDetailsSuccess) { - emit( - QuoteDetailsSuccess( - quote: lastState.quote, - quoteUpdateError: error, - ), - ); - } - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_screen.dart deleted file mode 100644 index 5069e464..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_screen.dart +++ /dev/null @@ -1,236 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; -import 'package:quote_details/src/quote_details_cubit.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:share_plus/share_plus.dart'; - -typedef QuoteDetailsShareableLinkGenerator = Future Function( - Quote quote, -); - -class QuoteDetailsScreen extends StatelessWidget { - const QuoteDetailsScreen({ - required this.quoteId, - required this.onAuthenticationError, - required this.quoteRepository, - required this.shareableLinkGenerator, - Key? key, - }) : super(key: key); - - final int quoteId; - final VoidCallback onAuthenticationError; - final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => QuoteDetailsCubit( - quoteId: quoteId, - quoteRepository: quoteRepository, - ), - child: QuoteDetailsView( - onAuthenticationError: onAuthenticationError, - shareableLinkGenerator: shareableLinkGenerator, - ), - ); - } -} - -@visibleForTesting -class QuoteDetailsView extends StatelessWidget { - const QuoteDetailsView({ - required this.onAuthenticationError, - required this.shareableLinkGenerator, - Key? key, - }) : super(key: key); - - final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; - - @override - Widget build(BuildContext context) { - return StyledStatusBar.dark( - child: BlocConsumer( - listener: (context, state) { - final quoteUpdateError = - state is QuoteDetailsSuccess ? state.quoteUpdateError : null; - if (quoteUpdateError != null) { - final snackBar = - quoteUpdateError is UserAuthenticationRequiredException - ? const AuthenticationRequiredErrorSnackBar() - : const GenericErrorSnackBar(); - - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar(snackBar); - - if (quoteUpdateError is UserAuthenticationRequiredException) { - onAuthenticationError(); - } - } - }, - builder: (context, state) { - return WillPopScope( - onWillPop: () async { - final displayedQuote = - state is QuoteDetailsSuccess ? state.quote : null; - Navigator.of(context).pop(displayedQuote); - return false; - }, - child: Scaffold( - appBar: state is QuoteDetailsSuccess - ? _QuoteActionsAppBar( - quote: state.quote, - shareableLinkGenerator: shareableLinkGenerator, - ) - : null, - body: SafeArea( - child: Padding( - padding: EdgeInsets.all( - WonderTheme.of(context).screenMargin, - ), - child: state is QuoteDetailsSuccess - ? _Quote( - quote: state.quote, - ) - : state is QuoteDetailsFailure - ? ExceptionIndicator( - onTryAgain: () { - final cubit = context.read(); - cubit.refetch(); - }, - ) - : const CenteredCircularProgressIndicator(), - ), - ), - ), - ); - }, - ), - ); - } -} - -class _QuoteActionsAppBar extends StatelessWidget - implements PreferredSizeWidget { - const _QuoteActionsAppBar({ - required this.quote, - required this.shareableLinkGenerator, - Key? key, - }) : super(key: key); - - final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; - - @override - Widget build(BuildContext context) { - final cubit = context.read(); - return RowAppBar( - children: [ - FavoriteIconButton( - isFavorite: quote.isFavorite ?? false, - onTap: () { - if (quote.isFavorite == true) { - cubit.unfavoriteQuote(); - } else { - cubit.favoriteQuote(); - } - }, - ), - UpvoteIconButton( - count: quote.upvotesCount, - isUpvoted: quote.isUpvoted ?? false, - onTap: () { - if (quote.isUpvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.upvoteQuote(); - } - }, - ), - DownvoteIconButton( - count: quote.downvotesCount, - isDownvoted: quote.isDownvoted ?? false, - onTap: () { - if (quote.isDownvoted == true) { - cubit.unvoteQuote(); - } else { - cubit.downvoteQuote(); - } - }, - ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( - url, - ), - ); - }, - ), - ], - ); - } - - @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); -} - -class _Quote extends StatelessWidget { - static const double _quoteIconWidth = 46; - - const _Quote({ - required this.quote, - Key? key, - }) : super(key: key); - - final Quote quote; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - const Align( - alignment: Alignment.centerLeft, - child: OpeningQuoteSvgAsset( - width: _quoteIconWidth, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.xxLarge, - ), - child: Center( - child: ShrinkableText( - quote.body, - style: theme.quoteTextStyle.copyWith( - fontSize: FontSize.xxLarge, - ), - ), - ), - ), - ), - const ClosingQuoteSvgAsset( - width: _quoteIconWidth, - ), - const SizedBox( - height: Spacing.medium, - ), - Text( - quote.author ?? '', - style: const TextStyle( - fontSize: FontSize.large, - ), - ), - ], - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_state.dart deleted file mode 100644 index f89c5c92..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/lib/src/quote_details_state.dart +++ /dev/null @@ -1,35 +0,0 @@ -part of 'quote_details_cubit.dart'; - -abstract class QuoteDetailsState extends Equatable { - const QuoteDetailsState(); -} - -class QuoteDetailsInProgress extends QuoteDetailsState { - const QuoteDetailsInProgress(); - - @override - List get props => []; -} - -class QuoteDetailsSuccess extends QuoteDetailsState { - const QuoteDetailsSuccess({ - required this.quote, - this.quoteUpdateError, - }); - - final Quote quote; - final dynamic quoteUpdateError; - - @override - List get props => [ - quote, - quoteUpdateError, - ]; -} - -class QuoteDetailsFailure extends QuoteDetailsState { - const QuoteDetailsFailure(); - - @override - List get props => []; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/pubspec.yaml deleted file mode 100644 index 4ef00398..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/pubspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: quote_details -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - equatable: ^2.0.3 - flutter_bloc: ^8.0.1 - share_plus: ^2.1.4 - flutter: - sdk: flutter - quote_repository: - path: ../../quote_repository - domain_models: - path: ../../domain_models - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_details/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/l10n.yaml deleted file mode 100644 index da243646..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_list_localizations.dart -output-class: QuoteListLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/quote_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/quote_list.dart deleted file mode 100644 index cd64a336..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/quote_list.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/quote_list_localizations.dart'; -export 'src/quote_list_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/filter_horizontal_list.dart deleted file mode 100644 index 6128a04b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -const _itemSpacing = Spacing.xSmall; - -class FilterHorizontalList extends StatelessWidget { - const FilterHorizontalList({ - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.symmetric( - vertical: Spacing.mediumLarge, - ), - child: Row(children: [ - const _FavoritesChip(), - ...Tag.values - .map( - (tag) => _TagChip( - tag: tag, - ), - ) - .toList(), - ]), - ); - } -} - -class _FavoritesChip extends StatelessWidget { - const _FavoritesChip({ - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - return Padding( - padding: EdgeInsets.only( - right: _itemSpacing, - left: theme.screenMargin, - ), - child: BlocSelector( - selector: (state) { - final isFilteringByFavorites = - state.filter is QuoteListFilterByFavorites; - return isFilteringByFavorites; - }, - builder: (context, isFavoritesOnly) { - return RoundedChoiceChip( - label: 'Favorites', - avatar: Icon( - isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, - color: isFavoritesOnly - ? theme.roundedChoiceChipSelectedAvatarColor - : theme.roundedChoiceChipAvatarColor, - ), - isSelected: isFavoritesOnly, - onSelected: (isSelected) { - _releaseFocus(context); - final bloc = context.read(); - bloc.add( - const QuoteListFilterByFavoritesToggled(), - ); - }, - ); - }, - ), - ); - } -} - -class _TagChip extends StatelessWidget { - const _TagChip({ - required this.tag, - Key? key, - }) : super(key: key); - - final Tag tag; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final isLastTag = Tag.values.last == tag; - return Padding( - padding: EdgeInsets.only( - right: isLastTag ? theme.screenMargin : _itemSpacing, - left: _itemSpacing, - ), - child: BlocSelector( - selector: (state) { - final filter = state.filter; - final selectedTag = - filter is QuoteListFilterByTag ? filter.tag : null; - return selectedTag; - }, - builder: (context, selectedTag) { - final isSelected = selectedTag == tag; - return RoundedChoiceChip( - label: tag.toLocalizedString(context), - isSelected: isSelected, - onSelected: (isSelected) { - _releaseFocus(context); - final bloc = context.read(); - bloc.add( - QuoteListTagChanged( - isSelected ? tag : null, - ), - ); - }, - ); - }, - ), - ); - } -} - -void _releaseFocus(BuildContext context) { - FocusScope.of(context).unfocus(); -} - -extension on Tag { - String toLocalizedString(BuildContext context) { - final l10n = QuoteListLocalizations.of(context); - switch (this) { - case Tag.life: - return l10n.lifeTagLabel; - case Tag.happiness: - return l10n.happinessTagLabel; - case Tag.work: - return l10n.workTagLabel; - case Tag.nature: - return l10n.natureTagLabel; - case Tag.science: - return l10n.scienceTagLabel; - case Tag.love: - return l10n.loveTagLabel; - case Tag.funny: - return l10n.funnyTagLabel; - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/messages_en.arb deleted file mode 100644 index 652e7bf1..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", - "lifeTagLabel": "Life", - "happinessTagLabel": "Happiness", - "workTagLabel": "Work", - "natureTagLabel": "Nature", - "scienceTagLabel": "Science", - "loveTagLabel": "Love", - "funnyTagLabel": "Funny" -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart deleted file mode 100644 index 1dc2d271..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ /dev/null @@ -1,175 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_list_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteListLocalizations returned -/// by `QuoteListLocalizations.of(context)`. -/// -/// Applications need to include `QuoteListLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_list_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteListLocalizations.localizationsDelegates, -/// supportedLocales: QuoteListLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales -/// property. -abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @quoteListRefreshErrorMessage. - /// - /// In en, this message translates to: - /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** - String get quoteListRefreshErrorMessage; - - /// No description provided for @lifeTagLabel. - /// - /// In en, this message translates to: - /// **'Life'** - String get lifeTagLabel; - - /// No description provided for @happinessTagLabel. - /// - /// In en, this message translates to: - /// **'Happiness'** - String get happinessTagLabel; - - /// No description provided for @workTagLabel. - /// - /// In en, this message translates to: - /// **'Work'** - String get workTagLabel; - - /// No description provided for @natureTagLabel. - /// - /// In en, this message translates to: - /// **'Nature'** - String get natureTagLabel; - - /// No description provided for @scienceTagLabel. - /// - /// In en, this message translates to: - /// **'Science'** - String get scienceTagLabel; - - /// No description provided for @loveTagLabel. - /// - /// In en, this message translates to: - /// **'Love'** - String get loveTagLabel; - - /// No description provided for @funnyTagLabel. - /// - /// In en, this message translates to: - /// **'Funny'** - String get funnyTagLabel; -} - -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteListLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteListLocalizationsDelegate old) => false; -} - -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); - } - - throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart deleted file mode 100644 index 7e2619b9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'quote_list_localizations.dart'; - -/// The translations for English (`en`). -class QuoteListLocalizationsEn extends QuoteListLocalizations { - QuoteListLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; - - @override - String get lifeTagLabel => 'Life'; - - @override - String get happinessTagLabel => 'Happiness'; - - @override - String get workTagLabel => 'Work'; - - @override - String get natureTagLabel => 'Nature'; - - @override - String get scienceTagLabel => 'Science'; - - @override - String get loveTagLabel => 'Love'; - - @override - String get funnyTagLabel => 'Funny'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_bloc.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_bloc.dart deleted file mode 100644 index 640d27f2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ /dev/null @@ -1,385 +0,0 @@ -import 'dart:async'; - -import 'package:bloc_concurrency/bloc_concurrency.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'quote_list_event.dart'; - -part 'quote_list_state.dart'; - -class QuoteListBloc extends Bloc { - QuoteListBloc({ - required QuoteRepository quoteRepository, - required UserRepository userRepository, - }) : _quoteRepository = quoteRepository, - super( - const QuoteListState(), - ) { - _registerEventsHandler(); - - _authChangesSubscription = userRepository.getUser().listen( - (user) { - _authenticatedUsername = user?.username; - - add( - const QuoteListUsernameObtained(), - ); - }, - ); - } - - late final StreamSubscription _authChangesSubscription; - - String? _authenticatedUsername; - final QuoteRepository _quoteRepository; - - void _registerEventsHandler() { - on( - (event, emitter) async { - if (event is QuoteListUsernameObtained) { - await _handleQuoteListUsernameObtained(emitter); - } else if (event is QuoteListFailedFetchRetried) { - await _handleQuoteListFailedFetchRetried(emitter); - } else if (event is QuoteListItemUpdated) { - _handleQuoteListItemUpdated(emitter, event); - } else if (event is QuoteListTagChanged) { - await _handleQuoteListTagChanged(emitter, event); - } else if (event is QuoteListSearchTermChanged) { - await _handleQuoteListSearchTermChanged(emitter, event); - } else if (event is QuoteListRefreshed) { - await _handleQuoteListRefreshed(emitter, event); - } else if (event is QuoteListNextPageRequested) { - await _handleQuoteListNextPageRequested(emitter, event); - } else if (event is QuoteListItemFavoriteToggled) { - await _handleQuoteListItemFavoriteToggled(emitter, event); - } else if (event is QuoteListFilterByFavoritesToggled) { - await _handleQuoteListFilterByFavoritesToggled(emitter); - } - }, - transformer: (eventStream, eventHandler) { - final nonDebounceEventStream = eventStream.where( - (event) => event is! QuoteListSearchTermChanged, - ); - - final debounceEventStream = eventStream - .whereType() - .debounceTime( - const Duration(seconds: 1), - ) - .where((event) { - final previousFilter = state.filter; - final previousSearchTerm = - previousFilter is QuoteListFilterBySearchTerm - ? previousFilter.searchTerm - : ''; - - return event.searchTerm != previousSearchTerm; - }); - - final mergedEventStream = MergeStream([ - nonDebounceEventStream, - debounceEventStream, - ]); - - final restartableTransformer = restartable(); - return restartableTransformer(mergedEventStream, eventHandler); - }, - ); - } - - Future _handleQuoteListFailedFetchRetried(Emitter emitter) { - // Clears out the error and puts the loading indicator back on the screen. - emitter( - state.copyWithNewError(null), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - void _handleQuoteListItemUpdated( - Emitter emitter, - QuoteListItemUpdated event, - ) { - // Replaces the updated quote in the current state and re-emits it. - emitter( - state.copyWithUpdatedQuote( - event.updatedQuote, - ), - ); - } - - Future _handleQuoteListUsernameObtained(Emitter emitter) { - emitter( - QuoteListState( - filter: state.filter, - ), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.cacheAndNetwork, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - Future _handleQuoteListTagChanged( - Emitter emitter, - QuoteListTagChanged event, - ) { - emitter( - QuoteListState.loadingNewTag(tag: event.tag), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - // If the user is *deselecting* a tag, the `cachePreferably` fetch policy - // will return you the cached quotes. If the user is selecting a new tag - // instead, the `cachePreferably` fetch policy won't find any cached - // quotes and will instead use the network. - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - Future _handleQuoteListSearchTermChanged( - Emitter emitter, - QuoteListSearchTermChanged event, - ) { - emitter( - QuoteListState.loadingNewSearchTerm( - searchTerm: event.searchTerm, - ), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - // If the user is *clearing out* the search bar, the `cachePreferably` - // fetch policy will return you the cached quotes. If the user is - // entering a new search instead, the `cachePreferably` fetch policy - // won't find any cached quotes and will instead use the network. - fetchPolicy: QuoteListPageFetchPolicy.cachePreferably, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - Future _handleQuoteListRefreshed( - Emitter emitter, - QuoteListRefreshed event, - ) { - final firstPageFetchStream = _fetchQuotePage( - 1, - // Since the user is asking for a refresh, you don't want to get cached - // quotes, thus the `networkOnly` fetch policy makes the most sense. - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - isRefresh: true, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - Future _handleQuoteListNextPageRequested( - Emitter emitter, - QuoteListNextPageRequested event, - ) { - emitter( - state.copyWithNewError(null), - ); - - final nextPageFetchStream = _fetchQuotePage( - event.pageNumber, - // The `networkPreferably` fetch policy prioritizes fetching the new page - // from the server, and, if it fails, try grabbing it from the cache. - fetchPolicy: QuoteListPageFetchPolicy.networkPreferably, - ); - - return emitter.onEach( - nextPageFetchStream, - onData: emitter, - ); - } - - Future _handleQuoteListItemFavoriteToggled( - Emitter emitter, - QuoteListItemFavoriteToggled event, - ) async { - try { - // The `favoriteQuote()` and `unfavoriteQuote()` functions return you the - // updated quote object. - final updatedQuote = await (event is QuoteListItemFavorited - ? _quoteRepository.favoriteQuote( - event.id, - ) - : _quoteRepository.unfavoriteQuote( - event.id, - )); - final isFilteringByFavorites = state.filter is QuoteListFilterByFavorites; - - // If the user isn't filtering by favorites, you just replace the changed - // quote on-screen. - if (!isFilteringByFavorites) { - emitter( - state.copyWithUpdatedQuote( - updatedQuote, - ), - ); - } else { - // If the user *is* filtering by favorites, that means the user is - // actually *removing* a quote from the list, so you refresh the entire - // list to make sure you won't break the pagination. - emitter( - QuoteListState( - filter: state.filter, - ), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - fetchPolicy: QuoteListPageFetchPolicy.networkOnly, - ); - - await emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - } catch (error) { - // If an error happens trying to (un)favorite a quote you attach an error - // to the current state which will result on the screen showing a snackbar - // to the user and possibly taking him to the Sign In screen in case the - // cause is the user being signed out. - emitter( - state.copyWithFavoriteToggleError( - error, - ), - ); - } - } - - Future _handleQuoteListFilterByFavoritesToggled( - Emitter emitter, - ) { - final isFilteringByFavorites = state.filter is! QuoteListFilterByFavorites; - - emitter( - QuoteListState.loadingToggledFavoritesFilter( - isFilteringByFavorites: isFilteringByFavorites, - ), - ); - - final firstPageFetchStream = _fetchQuotePage( - 1, - // If the user is *adding* the favorites filter, you use the *cacheAndNetwork* - // fetch policy to show the cached data first followed by the updated list - // from the server. - // If the user is *removing* the favorites filter, you simply show the - // cached data they were seeing before applying the filter. - fetchPolicy: isFilteringByFavorites - ? QuoteListPageFetchPolicy.cacheAndNetwork - : QuoteListPageFetchPolicy.cachePreferably, - ); - - return emitter.onEach( - firstPageFetchStream, - onData: emitter, - ); - } - - Stream _fetchQuotePage( - int page, { - required QuoteListPageFetchPolicy fetchPolicy, - bool isRefresh = false, - }) async* { - final currentlyAppliedFilter = state.filter; - final isFilteringByFavorites = - currentlyAppliedFilter is QuoteListFilterByFavorites; - final isUserSignedIn = _authenticatedUsername != null; - if (isFilteringByFavorites && !isUserSignedIn) { - yield QuoteListState.noItemsFound( - filter: currentlyAppliedFilter, - ); - } else { - final pagesStream = _quoteRepository.getQuoteListPage( - page, - tag: currentlyAppliedFilter is QuoteListFilterByTag - ? currentlyAppliedFilter.tag - : null, - searchTerm: currentlyAppliedFilter is QuoteListFilterBySearchTerm - ? currentlyAppliedFilter.searchTerm - : '', - favoritedByUsername: - currentlyAppliedFilter is QuoteListFilterByFavorites - ? _authenticatedUsername - : null, - fetchPolicy: fetchPolicy, - ); - - try { - await for (final newPage in pagesStream) { - final newItemList = newPage.quoteList; - final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); - - final nextPage = newPage.isLastPage ? null : page + 1; - - yield QuoteListState.success( - nextPage: nextPage, - itemList: completeItemList, - filter: currentlyAppliedFilter, - isRefresh: isRefresh, - ); - } - } catch (error) { - if (error is EmptySearchResultException) { - yield QuoteListState.noItemsFound( - filter: currentlyAppliedFilter, - ); - } - - if (isRefresh) { - yield state.copyWithNewRefreshError( - error, - ); - } else { - yield state.copyWithNewError( - error, - ); - } - } - } - } - - @override - Future close() { - _authChangesSubscription.cancel(); - return super.close(); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_event.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_event.dart deleted file mode 100644 index f7b7701f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_event.dart +++ /dev/null @@ -1,86 +0,0 @@ -part of 'quote_list_bloc.dart'; - -abstract class QuoteListEvent extends Equatable { - const QuoteListEvent(); - - @override - List get props => []; -} - -class QuoteListFilterByFavoritesToggled extends QuoteListEvent { - const QuoteListFilterByFavoritesToggled(); -} - -class QuoteListTagChanged extends QuoteListEvent { - const QuoteListTagChanged( - this.tag, - ); - - final Tag? tag; - - @override - List get props => [ - tag, - ]; -} - -class QuoteListSearchTermChanged extends QuoteListEvent { - const QuoteListSearchTermChanged( - this.searchTerm, - ); - - final String searchTerm; - - @override - List get props => [ - searchTerm, - ]; -} - -class QuoteListRefreshed extends QuoteListEvent { - const QuoteListRefreshed(); -} - -class QuoteListNextPageRequested extends QuoteListEvent { - const QuoteListNextPageRequested({ - required this.pageNumber, - }); - - final int pageNumber; -} - -abstract class QuoteListItemFavoriteToggled extends QuoteListEvent { - const QuoteListItemFavoriteToggled( - this.id, - ); - - final int id; -} - -class QuoteListItemFavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemFavorited( - int id, - ) : super(id); -} - -class QuoteListItemUnfavorited extends QuoteListItemFavoriteToggled { - const QuoteListItemUnfavorited( - int id, - ) : super(id); -} - -class QuoteListFailedFetchRetried extends QuoteListEvent { - const QuoteListFailedFetchRetried(); -} - -class QuoteListUsernameObtained extends QuoteListEvent { - const QuoteListUsernameObtained(); -} - -class QuoteListItemUpdated extends QuoteListEvent { - const QuoteListItemUpdated( - this.updatedQuote, - ); - - final Quote updatedQuote; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_screen.dart deleted file mode 100644 index 88ab8d16..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_screen.dart +++ /dev/null @@ -1,207 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:monitoring/monitoring.dart'; -import 'package:quote_list/src/filter_horizontal_list.dart'; -import 'package:quote_list/src/l10n/quote_list_localizations.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; -import 'package:quote_repository/quote_repository.dart'; -import 'package:user_repository/user_repository.dart'; - -typedef QuoteSelected = Future Function(int selectedQuote); - -class QuoteListScreen extends StatelessWidget { - const QuoteListScreen({ - required this.quoteRepository, - required this.userRepository, - required this.onAuthenticationError, - required this.remoteValueService, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final QuoteRepository quoteRepository; - final UserRepository userRepository; - final RemoteValueService remoteValueService; - final QuoteSelected? onQuoteSelected; - final void Function(BuildContext context) onAuthenticationError; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => QuoteListBloc( - quoteRepository: quoteRepository, - userRepository: userRepository, - ), - child: QuoteListView( - onAuthenticationError: onAuthenticationError, - onQuoteSelected: onQuoteSelected, - remoteValueService: remoteValueService, - ), - ); - } -} - -@visibleForTesting -class QuoteListView extends StatefulWidget { - const QuoteListView({ - required this.remoteValueService, - required this.onAuthenticationError, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final RemoteValueService remoteValueService; - final QuoteSelected? onQuoteSelected; - final void Function(BuildContext context) onAuthenticationError; - - @override - _QuoteListViewState createState() => _QuoteListViewState(); -} - -class _QuoteListViewState extends State { - // For a deep dive on PagingController refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - final PagingController _pagingController = PagingController( - firstPageKey: 1, - ); - - final TextEditingController _searchBarController = TextEditingController(); - - QuoteListBloc get _bloc => context.read(); - - @override - void initState() { - _pagingController.addPageRequestListener((pageNumber) { - final isSubsequentPage = pageNumber > 1; - if (isSubsequentPage) { - _bloc.add( - QuoteListNextPageRequested( - pageNumber: pageNumber, - ), - ); - } - }); - - _searchBarController.addListener(() { - _bloc.add( - QuoteListSearchTermChanged( - _searchBarController.text, - ), - ); - }); - - super.initState(); - } - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final l10n = QuoteListLocalizations.of(context); - return BlocListener( - listener: (context, state) { - final searchBarText = _searchBarController.text; - final isSearching = - state.filter != null && state.filter is QuoteListFilterBySearchTerm; - if (searchBarText.isNotEmpty && !isSearching) { - _searchBarController.text = ''; - } - - if (state.refreshError != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - l10n.quoteListRefreshErrorMessage, - ), - ), - ); - } else if (state.favoriteToggleError != null) { - final snackBar = - state.favoriteToggleError is UserAuthenticationRequiredException - ? const AuthenticationRequiredErrorSnackBar() - : const GenericErrorSnackBar(); - - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar(snackBar); - - widget.onAuthenticationError(context); - } - - _pagingController.value = state.toPagingState(); - }, - child: StyledStatusBar.dark( - child: SafeArea( - child: Scaffold( - body: GestureDetector( - onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), - ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), - ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), - ), - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of( - context, - ).unfocus(); - - @override - void dispose() { - _pagingController.dispose(); - _searchBarController.dispose(); - super.dispose(); - } -} - -extension on QuoteListState { - PagingState toPagingState() { - return PagingState( - itemList: itemList, - nextPageKey: nextPage, - error: error, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_state.dart deleted file mode 100644 index b2a4a868..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_list_state.dart +++ /dev/null @@ -1,226 +0,0 @@ -part of 'quote_list_bloc.dart'; - -/// Holds all data needed to infer the state of the paginated grid of quotes. -/// -/// You don't have to memorize what combination of properties lead to which -/// visual outputs, the [infinite_scroll_pagination](https://github.com/EdsonBueno/infinite_scroll_pagination) -/// package takes care of that. Simply provide the values as you have them and -/// everything will work. -/// -/// For example: -/// 1. If both [itemList] and [error] aren't null, that is, if you have -/// both some quotes and an error at the same time, that means the error occurred -/// trying to fetch a *subsequent* page, therefore, the error indicator should -/// be appended to the bottom of the grid instead of taking the whole screen. -/// 2. If [error] isn't null but [itemList] is, that -/// means the error occurred trying to fetch the *first* page, in which case you -/// want to display the full-screen error indicator since you don't have any -/// quotes to show. -/// 3. If there's no [error], [itemList] has some items and [nextPage] isn't null, -/// that means you haven't fetched all pages yet and therefore a loading indicator -/// should be appended to the bottom of the grid. -class QuoteListState extends Equatable { - const QuoteListState({ - this.itemList, - this.nextPage, - this.error, - this.filter, - this.refreshError, - this.favoriteToggleError, - }); - - /// Holds all of the items from the pages you have loaded so far. - final List? itemList; - - /// The next page to be fetched, or `null` if you have already loaded the entire list. - /// - /// Besides determining which page should be asked next, it also determines - /// whether you need a loading indicator at the bottom to indicate you haven't - /// fetched all pages yet. - final int? nextPage; - - /// Indicates an error occurred trying to fetch any page of quotes. - /// - /// If both this property and [itemList] holds values, that means the error - /// occurred trying to fetch a subsequent page. If, on the other hand, this - /// property has a value but [itemList] doesn't, that means the error occurred - /// when fetching the first page. - final dynamic error; - - /// The currently applied filter (if any). - /// - /// Can be either a tag filter (`QuoteListFilterByTag`), a search filter (`QuoteListFilterBySearchTerm`), - /// or a favorites-only one (`QuoteListFilterByFavorites`). - final QuoteListFilter? filter; - - /// Indicates an error occurred trying to refresh the list. - /// - /// Used to display a snackbar to indicate the failure. - final dynamic refreshError; - - /// Indicates an error occurred trying to favorite a quote. - /// - /// Used to display a snackbar to the user indicating the failure and also - /// redirect them to the Sign In screen in case the cause of the error is the - /// user being signed out. - final dynamic favoriteToggleError; - - /// Auxiliary constructor that facilitates building the state for when the app - /// is loading a tag change. - QuoteListState.loadingNewTag({ - required Tag? tag, - }) : this( - filter: tag != null ? QuoteListFilterByTag(tag) : null, - ); - - /// Auxiliary constructor that facilitates building the state for when the app - /// is loading a search change. - QuoteListState.loadingNewSearchTerm({ - required String searchTerm, - }) : this( - filter: searchTerm.isEmpty - ? null - : QuoteListFilterBySearchTerm( - searchTerm, - ), - ); - - /// Auxiliary constructor that facilitates building the state for when the app - /// is loading a change in the favorites-only toggle. - const QuoteListState.loadingToggledFavoritesFilter({ - required bool isFilteringByFavorites, - }) : this( - filter: isFilteringByFavorites - ? const QuoteListFilterByFavorites() - : null, - ); - - /// Auxiliary constructor that facilitates building the state for when the app - /// couldn't find any items for the selected filter. - const QuoteListState.noItemsFound({ - required QuoteListFilter? filter, - }) : this( - itemList: const [], - error: null, - nextPage: 1, - filter: filter, - ); - - /// Auxiliary constructor that facilitates building the state for when the app - /// has successfully loaded a new page. - const QuoteListState.success({ - required int? nextPage, - required List itemList, - required QuoteListFilter? filter, - required bool isRefresh, - }) : this( - nextPage: nextPage, - itemList: itemList, - filter: filter, - ); - - /// Auxiliary function that creates a copy of the current state with a new - /// value for the [error] property. - QuoteListState copyWithNewError( - dynamic error, - ) => - QuoteListState( - itemList: itemList, - nextPage: nextPage, - error: error, - filter: filter, - refreshError: null, - ); - - /// Auxiliary function that creates a copy of the current state with a new - /// value for the [refreshError] property. - QuoteListState copyWithNewRefreshError( - dynamic refreshError, - ) => - QuoteListState( - itemList: itemList, - nextPage: nextPage, - error: error, - filter: filter, - refreshError: refreshError, - favoriteToggleError: null, - ); - - /// Auxiliary function that creates a copy of the current state by replacing - /// just the [updatedQuote]. - QuoteListState copyWithUpdatedQuote( - Quote updatedQuote, - ) { - return QuoteListState( - itemList: itemList?.map((quote) { - if (quote.id == updatedQuote.id) { - return updatedQuote; - } else { - return quote; - } - }).toList(), - nextPage: nextPage, - error: error, - filter: filter, - refreshError: null, - favoriteToggleError: null, - ); - } - - /// Auxiliary function that creates a copy of the current state with a new - /// value for the [favoriteToggleError] property. - QuoteListState copyWithFavoriteToggleError( - dynamic favoriteToggleError, - ) => - QuoteListState( - itemList: itemList, - nextPage: nextPage, - error: error, - filter: filter, - refreshError: refreshError, - favoriteToggleError: favoriteToggleError, - ); - - @override - List get props => [ - itemList, - nextPage, - error, - filter, - refreshError, - favoriteToggleError, - ]; -} - -abstract class QuoteListFilter extends Equatable { - const QuoteListFilter(); - - @override - List get props => []; -} - -class QuoteListFilterByTag extends QuoteListFilter { - const QuoteListFilterByTag(this.tag); - - final Tag tag; - - @override - List get props => [ - tag, - ]; -} - -class QuoteListFilterBySearchTerm extends QuoteListFilter { - const QuoteListFilterBySearchTerm(this.searchTerm); - - final String searchTerm; - - @override - List get props => [ - searchTerm, - ]; -} - -class QuoteListFilterByFavorites extends QuoteListFilter { - const QuoteListFilterByFavorites(); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_grid.dart deleted file mode 100644 index d19db77d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -class QuoteSliverGrid extends StatelessWidget { - static const _gridColumnCount = 2; - - const QuoteSliverGrid({ - required this.pagingController, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final PagingController pagingController; - final QuoteSelected? onQuoteSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final onQuoteSelected = this.onQuoteSelected; - final bloc = context.read(); - - return SliverPadding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( - pagingController: pagingController, - builderDelegate: PagedChildBuilderDelegate( - itemBuilder: (context, quote, index) { - final isFavorite = quote.isFavorite ?? false; - return QuoteCard( - statement: quote.body, - author: quote.author, - isFavorite: isFavorite, - top: const OpeningQuoteSvgAsset(), - bottom: const ClosingQuoteSvgAsset(), - onFavorite: () { - bloc.add( - isFavorite - ? QuoteListItemUnfavorited(quote.id) - : QuoteListItemFavorited(quote.id), - ); - }, - onTap: onQuoteSelected != null - ? () async { - final updatedQuote = await onQuoteSelected(quote.id); - - if (updatedQuote != null && - updatedQuote.isFavorite != quote.isFavorite) { - bloc.add( - QuoteListItemUpdated( - updatedQuote, - ), - ); - } - } - : null, - ); - }, - firstPageErrorIndicatorBuilder: (context) { - return ExceptionIndicator( - onTryAgain: () { - bloc.add( - const QuoteListFailedFetchRetried(), - ); - }, - ); - }, - ), - crossAxisCount: _gridColumnCount, - crossAxisSpacing: theme.gridSpacing, - mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), - ), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_list.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_list.dart deleted file mode 100644 index 0fa8e548..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; -import 'package:quote_list/quote_list.dart'; -import 'package:quote_list/src/quote_list_bloc.dart'; - -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ - required this.pagingController, - this.onQuoteSelected, - Key? key, - }) : super(key: key); - - final PagingController pagingController; - final QuoteSelected? onQuoteSelected; - - @override - Widget build(BuildContext context) { - final theme = WonderTheme.of(context); - final onQuoteSelected = this.onQuoteSelected; - final bloc = context.read(); - - return SliverPadding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - sliver: PagedSliverList.separated( - pagingController: pagingController, - builderDelegate: PagedChildBuilderDelegate( - itemBuilder: (context, quote, index) { - final isFavorite = quote.isFavorite ?? false; - return QuoteCard( - statement: quote.body, - author: quote.author, - isFavorite: isFavorite, - top: const OpeningQuoteSvgAsset(), - bottom: const ClosingQuoteSvgAsset(), - onFavorite: () { - bloc.add( - isFavorite - ? QuoteListItemUnfavorited(quote.id) - : QuoteListItemFavorited(quote.id), - ); - }, - onTap: onQuoteSelected != null - ? () async { - final updatedQuote = await onQuoteSelected(quote.id); - - if (updatedQuote != null && - updatedQuote.isFavorite != quote.isFavorite) { - bloc.add( - QuoteListItemUpdated( - updatedQuote, - ), - ); - } - } - : null, - ); - }, - firstPageErrorIndicatorBuilder: (context) { - return ExceptionIndicator( - onTryAgain: () { - bloc.add( - const QuoteListFailedFetchRetried(), - ); - }, - ); - }, - ), - separatorBuilder: (context, index) => - SizedBox(height: theme.gridSpacing)), - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/pubspec.yaml deleted file mode 100644 index 34294525..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/pubspec.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: quote_list -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - equatable: ^2.0.3 - flutter_bloc: ^8.0.1 - bloc_concurrency: ^0.2.0 - flutter: - sdk: flutter - domain_models: - path: ../../domain_models - quote_repository: - path: ../../quote_repository - user_repository: - path: ../../user_repository - monitoring: - path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop - rxdart: ^0.27.3 - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/quote_list/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/l10n.yaml deleted file mode 100644 index d7017652..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: sign_in_localizations.dart -output-class: SignInLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/sign_in.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/sign_in.dart deleted file mode 100644 index 167cf479..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/sign_in.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/sign_in_localizations.dart'; -export 'src/sign_in_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/messages_en.arb deleted file mode 100644 index 46b54ca5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,14 +0,0 @@ -{ - "invalidCredentialsErrorMessage": "Invalid email and/or password.", - "appBarTitle": "Sign In", - "emailTextFieldLabel": "Email", - "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", - "emailTextFieldInvalidErrorMessage": "This email is not valid.", - "passwordTextFieldLabel": "Password", - "passwordTextFieldEmptyErrorMessage": "Your password can't be empty.", - "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "forgotMyPasswordButtonLabel": "Forgot my password", - "signInButtonLabel": "Sign In", - "signUpOpeningText": "Don't have an account?", - "signUpButtonLabel": "Sign up" -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart deleted file mode 100644 index 6a7ad45a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ /dev/null @@ -1,198 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'sign_in_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of SignInLocalizations returned -/// by `SignInLocalizations.of(context)`. -/// -/// Applications need to include `SignInLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/sign_in_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: SignInLocalizations.localizationsDelegates, -/// supportedLocales: SignInLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the SignInLocalizations.supportedLocales -/// property. -abstract class SignInLocalizations { - SignInLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static SignInLocalizations of(BuildContext context) { - return Localizations.of(context, SignInLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _SignInLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @invalidCredentialsErrorMessage. - /// - /// In en, this message translates to: - /// **'Invalid email and/or password.'** - String get invalidCredentialsErrorMessage; - - /// No description provided for @appBarTitle. - /// - /// In en, this message translates to: - /// **'Sign In'** - String get appBarTitle; - - /// No description provided for @emailTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Email'** - String get emailTextFieldLabel; - - /// No description provided for @emailTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your email can\'t be empty.'** - String get emailTextFieldEmptyErrorMessage; - - /// No description provided for @emailTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is not valid.'** - String get emailTextFieldInvalidErrorMessage; - - /// No description provided for @passwordTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Password'** - String get passwordTextFieldLabel; - - /// No description provided for @passwordTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your password can\'t be empty.'** - String get passwordTextFieldEmptyErrorMessage; - - /// No description provided for @passwordTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Password must be at least five characters long.'** - String get passwordTextFieldInvalidErrorMessage; - - /// No description provided for @forgotMyPasswordButtonLabel. - /// - /// In en, this message translates to: - /// **'Forgot my password'** - String get forgotMyPasswordButtonLabel; - - /// No description provided for @signInButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign In'** - String get signInButtonLabel; - - /// No description provided for @signUpOpeningText. - /// - /// In en, this message translates to: - /// **'Don\'t have an account?'** - String get signUpOpeningText; - - /// No description provided for @signUpButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign up'** - String get signUpButtonLabel; -} - -class _SignInLocalizationsDelegate - extends LocalizationsDelegate { - const _SignInLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupSignInLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_SignInLocalizationsDelegate old) => false; -} - -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return SignInLocalizationsEn(); - } - - throw FlutterError( - 'SignInLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations_en.dart deleted file mode 100644 index 1cfaae6a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/l10n/sign_in_localizations_en.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'sign_in_localizations.dart'; - -/// The translations for English (`en`). -class SignInLocalizationsEn extends SignInLocalizations { - SignInLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get invalidCredentialsErrorMessage => 'Invalid email and/or password.'; - - @override - String get appBarTitle => 'Sign In'; - - @override - String get emailTextFieldLabel => 'Email'; - - @override - String get emailTextFieldEmptyErrorMessage => 'Your email can\'t be empty.'; - - @override - String get emailTextFieldInvalidErrorMessage => 'This email is not valid.'; - - @override - String get passwordTextFieldLabel => 'Password'; - - @override - String get passwordTextFieldEmptyErrorMessage => - 'Your password can\'t be empty.'; - - @override - String get passwordTextFieldInvalidErrorMessage => - 'Password must be at least five characters long.'; - - @override - String get forgotMyPasswordButtonLabel => 'Forgot my password'; - - @override - String get signInButtonLabel => 'Sign In'; - - @override - String get signUpOpeningText => 'Don\'t have an account?'; - - @override - String get signUpButtonLabel => 'Sign up'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_cubit.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_cubit.dart deleted file mode 100644 index fe0f041a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_cubit.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'sign_in_state.dart'; - -class SignInCubit extends Cubit { - SignInCubit({ - required this.userRepository, - }) : super( - const SignInState(), - ); - - final UserRepository userRepository; - - void onEmailChanged(String newValue) { - final previousScreenState = state; - final previousEmailState = previousScreenState.email; - final shouldValidate = previousEmailState.invalid; - final newEmailState = shouldValidate - ? Email.validated( - newValue, - ) - : Email.unvalidated( - newValue, - ); - - final newScreenState = state.copyWith( - email: newEmailState, - ); - - emit(newScreenState); - } - - void onEmailUnfocused() { - final previousScreenState = state; - final previousEmailState = previousScreenState.email; - final previousEmailValue = previousEmailState.value; - - final newEmailState = Email.validated( - previousEmailValue, - ); - final newScreenState = previousScreenState.copyWith( - email: newEmailState, - ); - emit(newScreenState); - } - - void onPasswordChanged(String newValue) { - final previousScreenState = state; - final previousPasswordState = previousScreenState.password; - final shouldValidate = previousPasswordState.invalid; - final newPasswordState = shouldValidate - ? Password.validated( - newValue, - ) - : Password.unvalidated( - newValue, - ); - - final newScreenState = state.copyWith( - password: newPasswordState, - ); - - emit(newScreenState); - } - - void onPasswordUnfocused() { - final previousScreenState = state; - final previousPasswordState = previousScreenState.password; - final previousPasswordValue = previousPasswordState.value; - - final newPasswordState = Password.validated( - previousPasswordValue, - ); - final newScreenState = previousScreenState.copyWith( - password: newPasswordState, - ); - emit(newScreenState); - } - - void onSubmit() async { - final email = Email.validated(state.email.value); - final password = Password.validated(state.password.value); - - final isFormValid = Formz.validate([ - email, - password, - ]).isValid; - - final newState = state.copyWith( - email: email, - password: password, - submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, - ); - - emit(newState); - - if (isFormValid) { - try { - await userRepository.signIn( - email.value, - password.value, - ); - final newState = state.copyWith( - submissionStatus: SubmissionStatus.success, - ); - emit(newState); - } catch (error) { - final newState = state.copyWith( - submissionStatus: error is InvalidCredentialsException - ? SubmissionStatus.invalidCredentialsError - : SubmissionStatus.genericError, - ); - emit(newState); - } - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_screen.dart deleted file mode 100644 index 82ce0da0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_screen.dart +++ /dev/null @@ -1,243 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:sign_in/src/l10n/sign_in_localizations.dart'; -import 'package:sign_in/src/sign_in_cubit.dart'; -import 'package:user_repository/user_repository.dart'; - -class SignInScreen extends StatelessWidget { - const SignInScreen({ - required this.userRepository, - required this.onSignInSuccess, - this.onForgotMyPasswordTap, - this.onSignUpTap, - Key? key, - }) : super(key: key); - - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - final VoidCallback onSignInSuccess; - final UserRepository userRepository; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => SignInCubit( - userRepository: userRepository, - ), - child: SignInView( - onSignUpTap: onSignUpTap, - onSignInSuccess: onSignInSuccess, - onForgotMyPasswordTap: onForgotMyPasswordTap, - ), - ); - } -} - -@visibleForTesting -class SignInView extends StatelessWidget { - const SignInView({ - required this.onSignInSuccess, - this.onSignUpTap, - this.onForgotMyPasswordTap, - Key? key, - }) : super(key: key); - - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - final VoidCallback onSignInSuccess; - - @override - Widget build(BuildContext context) { - final l10n = SignInLocalizations.of(context); - return GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - l10n.appBarTitle, - ), - ), - body: Center( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric( - horizontal: Spacing.mediumLarge, - ), - child: _SignInForm( - onSignUpTap: onSignUpTap, - onForgotMyPasswordTap: onForgotMyPasswordTap, - onSignInSuccess: onSignInSuccess, - ), - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _SignInForm extends StatefulWidget { - const _SignInForm({ - required this.onSignInSuccess, - this.onSignUpTap, - this.onForgotMyPasswordTap, - Key? key, - }) : super(key: key); - - final VoidCallback? onSignUpTap; - final VoidCallback? onForgotMyPasswordTap; - final VoidCallback onSignInSuccess; - - @override - State<_SignInForm> createState() => _SignInFormState(); -} - -class _SignInFormState extends State<_SignInForm> { - final _emailFocusNode = FocusNode(); - final _passwordFocusNode = FocusNode(); - - @override - void initState() { - super.initState(); - final cubit = context.read(); - _emailFocusNode.addListener(() { - if (!_emailFocusNode.hasFocus) { - cubit.onEmailUnfocused(); - } - }); - _passwordFocusNode.addListener(() { - if (!_passwordFocusNode.hasFocus) { - cubit.onPasswordUnfocused(); - } - }); - } - - @override - void dispose() { - _emailFocusNode.dispose(); - _passwordFocusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = SignInLocalizations.of(context); - return BlocConsumer( - listenWhen: (oldState, newState) => - oldState.submissionStatus != newState.submissionStatus, - listener: (context, state) { - if (state.submissionStatus == SubmissionStatus.success) { - widget.onSignInSuccess(); - return; - } - - final hasSubmissionError = state.submissionStatus == - SubmissionStatus.genericError || - state.submissionStatus == SubmissionStatus.invalidCredentialsError; - - if (hasSubmissionError) { - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar( - state.submissionStatus == SubmissionStatus.invalidCredentialsError - ? SnackBar( - content: Text( - l10n.invalidCredentialsErrorMessage, - ), - ) - : const GenericErrorSnackBar(), - ); - } - }, - builder: (context, state) { - final emailError = state.email.invalid ? state.email.error : null; - final passwordError = - state.password.invalid ? state.password.error : null; - final isSubmissionInProgress = - state.submissionStatus == SubmissionStatus.inProgress; - - final cubit = context.read(); - return Column( - children: [ - TextField( - focusNode: _emailFocusNode, - onChanged: cubit.onEmailChanged, - textInputAction: TextInputAction.next, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.alternate_email, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null - ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : l10n.emailTextFieldInvalidErrorMessage), - ), - ), - const SizedBox( - height: Spacing.large, - ), - TextField( - focusNode: _passwordFocusNode, - onChanged: cubit.onPasswordChanged, - obscureText: true, - onEditingComplete: cubit.onSubmit, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.password, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.passwordTextFieldLabel, - errorText: passwordError == null - ? null - : (passwordError == PasswordValidationError.empty - ? l10n.passwordTextFieldEmptyErrorMessage - : l10n.passwordTextFieldInvalidErrorMessage), - ), - ), - TextButton( - child: Text( - l10n.forgotMyPasswordButtonLabel, - ), - onPressed: - isSubmissionInProgress ? null : widget.onForgotMyPasswordTap, - ), - const SizedBox( - height: Spacing.small, - ), - isSubmissionInProgress - ? ExpandedElevatedButton.inProgress( - label: l10n.signInButtonLabel, - ) - : ExpandedElevatedButton( - onTap: cubit.onSubmit, - label: l10n.signInButtonLabel, - icon: const Icon( - Icons.login, - ), - ), - const SizedBox( - height: Spacing.xxLarge, - ), - Text( - l10n.signUpOpeningText, - ), - TextButton( - child: Text( - l10n.signUpButtonLabel, - ), - onPressed: isSubmissionInProgress ? null : widget.onSignUpTap, - ), - ], - ); - }, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_state.dart deleted file mode 100644 index 05f6065f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/lib/src/sign_in_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -part of 'sign_in_cubit.dart'; - -class SignInState extends Equatable { - const SignInState({ - this.email = const Email.unvalidated(), - this.password = const Password.unvalidated(), - this.submissionStatus = SubmissionStatus.idle, - }); - - final Email email; - final Password password; - final SubmissionStatus submissionStatus; - - SignInState copyWith({ - Email? email, - Password? password, - SubmissionStatus? submissionStatus, - }) { - return SignInState( - email: email ?? this.email, - password: password ?? this.password, - submissionStatus: submissionStatus ?? this.submissionStatus, - ); - } - - @override - List get props => [ - email, - password, - submissionStatus, - ]; -} - -enum SubmissionStatus { - /// Used when the form has not been sent yet. - idle, - - /// Used to disable all buttons and add a progress indicator to the main one. - inProgress, - - /// Used to close the screen and navigate back to the caller screen. - success, - - /// Used to display a generic snack bar saying that an error has occurred, e.g., no internet connection. - genericError, - - /// Used to show a more specific error telling the user they got the email and/or password wrong. - invalidCredentialsError, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/pubspec.yaml deleted file mode 100644 index 71824a86..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/pubspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: sign_in -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - flutter_bloc: ^8.0.1 - flutter: - sdk: flutter - user_repository: - path: ../../user_repository - form_fields: - path: ../../form_fields - domain_models: - path: ../../domain_models - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_in/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/l10n.yaml deleted file mode 100644 index 2689ffe5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: sign_up_localizations.dart -output-class: SignUpLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/sign_up.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/sign_up.dart deleted file mode 100644 index a615a1d4..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/sign_up.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/sign_up_localizations.dart'; -export 'src/sign_up_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/messages_en.arb deleted file mode 100644 index a552010a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,19 +0,0 @@ -{ - "invalidCredentialsErrorMessage": "Invalid email and/or password.", - "appBarTitle": "Sign Up", - "signUpButtonLabel": "Sign Up", - "usernameTextFieldLabel": "Username", - "usernameTextFieldEmptyErrorMessage": "Your username can't be empty.", - "usernameTextFieldInvalidErrorMessage": "Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).", - "usernameTextFieldAlreadyTakenErrorMessage": "This username is already taken.", - "emailTextFieldLabel": "Email", - "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", - "emailTextFieldInvalidErrorMessage": "This email is not valid.", - "emailTextFieldAlreadyRegisteredErrorMessage": "This email is already registered.", - "passwordTextFieldLabel": "Password", - "passwordTextFieldEmptyErrorMessage": "Your password can't be empty.", - "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "passwordConfirmationTextFieldLabel": "Password Confirmation", - "passwordConfirmationTextFieldEmptyErrorMessage": "Can't be empty.", - "passwordConfirmationTextFieldInvalidErrorMessage": "Your passwords don't match." -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart deleted file mode 100644 index 2ea03681..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ /dev/null @@ -1,228 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'sign_up_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of SignUpLocalizations returned -/// by `SignUpLocalizations.of(context)`. -/// -/// Applications need to include `SignUpLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/sign_up_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: SignUpLocalizations.localizationsDelegates, -/// supportedLocales: SignUpLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the SignUpLocalizations.supportedLocales -/// property. -abstract class SignUpLocalizations { - SignUpLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static SignUpLocalizations of(BuildContext context) { - return Localizations.of(context, SignUpLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _SignUpLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @invalidCredentialsErrorMessage. - /// - /// In en, this message translates to: - /// **'Invalid email and/or password.'** - String get invalidCredentialsErrorMessage; - - /// No description provided for @appBarTitle. - /// - /// In en, this message translates to: - /// **'Sign Up'** - String get appBarTitle; - - /// No description provided for @signUpButtonLabel. - /// - /// In en, this message translates to: - /// **'Sign Up'** - String get signUpButtonLabel; - - /// No description provided for @usernameTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Username'** - String get usernameTextFieldLabel; - - /// No description provided for @usernameTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your username can\'t be empty.'** - String get usernameTextFieldEmptyErrorMessage; - - /// No description provided for @usernameTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).'** - String get usernameTextFieldInvalidErrorMessage; - - /// No description provided for @usernameTextFieldAlreadyTakenErrorMessage. - /// - /// In en, this message translates to: - /// **'This username is already taken.'** - String get usernameTextFieldAlreadyTakenErrorMessage; - - /// No description provided for @emailTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Email'** - String get emailTextFieldLabel; - - /// No description provided for @emailTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your email can\'t be empty.'** - String get emailTextFieldEmptyErrorMessage; - - /// No description provided for @emailTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is not valid.'** - String get emailTextFieldInvalidErrorMessage; - - /// No description provided for @emailTextFieldAlreadyRegisteredErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is already registered.'** - String get emailTextFieldAlreadyRegisteredErrorMessage; - - /// No description provided for @passwordTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Password'** - String get passwordTextFieldLabel; - - /// No description provided for @passwordTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your password can\'t be empty.'** - String get passwordTextFieldEmptyErrorMessage; - - /// No description provided for @passwordTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Password must be at least five characters long.'** - String get passwordTextFieldInvalidErrorMessage; - - /// No description provided for @passwordConfirmationTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Password Confirmation'** - String get passwordConfirmationTextFieldLabel; - - /// No description provided for @passwordConfirmationTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Can\'t be empty.'** - String get passwordConfirmationTextFieldEmptyErrorMessage; - - /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Your passwords don\'t match.'** - String get passwordConfirmationTextFieldInvalidErrorMessage; -} - -class _SignUpLocalizationsDelegate - extends LocalizationsDelegate { - const _SignUpLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupSignUpLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_SignUpLocalizationsDelegate old) => false; -} - -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return SignUpLocalizationsEn(); - } - - throw FlutterError( - 'SignUpLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations_en.dart deleted file mode 100644 index fed5025f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/l10n/sign_up_localizations_en.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'sign_up_localizations.dart'; - -/// The translations for English (`en`). -class SignUpLocalizationsEn extends SignUpLocalizations { - SignUpLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get invalidCredentialsErrorMessage => 'Invalid email and/or password.'; - - @override - String get appBarTitle => 'Sign Up'; - - @override - String get signUpButtonLabel => 'Sign Up'; - - @override - String get usernameTextFieldLabel => 'Username'; - - @override - String get usernameTextFieldEmptyErrorMessage => - 'Your username can\'t be empty.'; - - @override - String get usernameTextFieldInvalidErrorMessage => - 'Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).'; - - @override - String get usernameTextFieldAlreadyTakenErrorMessage => - 'This username is already taken.'; - - @override - String get emailTextFieldLabel => 'Email'; - - @override - String get emailTextFieldEmptyErrorMessage => 'Your email can\'t be empty.'; - - @override - String get emailTextFieldInvalidErrorMessage => 'This email is not valid.'; - - @override - String get emailTextFieldAlreadyRegisteredErrorMessage => - 'This email is already registered.'; - - @override - String get passwordTextFieldLabel => 'Password'; - - @override - String get passwordTextFieldEmptyErrorMessage => - 'Your password can\'t be empty.'; - - @override - String get passwordTextFieldInvalidErrorMessage => - 'Password must be at least five characters long.'; - - @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; - - @override - String get passwordConfirmationTextFieldEmptyErrorMessage => - 'Can\'t be empty.'; - - @override - String get passwordConfirmationTextFieldInvalidErrorMessage => - 'Your passwords don\'t match.'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_cubit.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_cubit.dart deleted file mode 100644 index 1c5749c0..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_cubit.dart +++ /dev/null @@ -1,200 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'sign_up_state.dart'; - -class SignUpCubit extends Cubit { - SignUpCubit({ - required this.userRepository, - }) : super( - const SignUpState(), - ); - - final UserRepository userRepository; - - void onEmailChanged(String newValue) { - final previousEmail = state.email; - final shouldValidate = previousEmail.invalid; - final newState = state.copyWith( - email: shouldValidate - ? Email.validated( - newValue, - isAlreadyRegistered: newValue == previousEmail.value - ? previousEmail.isAlreadyRegistered - : false, - ) - : Email.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onEmailUnfocused() { - final newState = state.copyWith( - email: Email.validated( - state.email.value, - isAlreadyRegistered: state.email.isAlreadyRegistered, - ), - ); - - emit(newState); - } - - void onUsernameChanged(String newValue) { - final previousUsername = state.username; - final shouldValidate = previousUsername.invalid; - final newState = state.copyWith( - username: shouldValidate - ? Username.validated( - newValue, - isAlreadyRegistered: newValue == previousUsername.value - ? previousUsername.isAlreadyRegistered - : false, - ) - : Username.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onUsernameUnfocused() { - final newState = state.copyWith( - username: Username.validated( - state.username.value, - isAlreadyRegistered: state.username.isAlreadyRegistered, - ), - ); - - emit(newState); - } - - void onPasswordChanged(String newValue) { - final previousPassword = state.password; - final shouldValidate = previousPassword.invalid; - final newState = state.copyWith( - password: shouldValidate - ? Password.validated( - newValue, - ) - : Password.unvalidated( - newValue, - ), - ); - - emit(newState); - } - - void onPasswordUnfocused() { - final newState = state.copyWith( - password: Password.validated( - state.password.value, - ), - ); - emit(newState); - } - - void onPasswordConfirmationChanged(String newValue) { - final previousPasswordConfirmation = state.passwordConfirmation; - final shouldValidate = previousPasswordConfirmation.invalid; - final newState = state.copyWith( - passwordConfirmation: shouldValidate - ? PasswordConfirmation.validated( - newValue, - password: state.password, - ) - : PasswordConfirmation.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onPasswordConfirmationUnfocused() { - final newState = state.copyWith( - passwordConfirmation: PasswordConfirmation.validated( - state.passwordConfirmation.value, - password: state.password, - ), - ); - emit(newState); - } - - void onSubmit() async { - final username = Username.validated( - state.username.value, - isAlreadyRegistered: state.username.isAlreadyRegistered, - ); - - final email = Email.validated( - state.email.value, - isAlreadyRegistered: state.email.isAlreadyRegistered, - ); - - final password = Password.validated( - state.password.value, - ); - - final passwordConfirmation = PasswordConfirmation.validated( - state.passwordConfirmation.value, - password: password, - ); - - final isFormValid = Formz.validate([ - username, - email, - password, - passwordConfirmation, - ]) == - FormzStatus.valid; - - final newState = state.copyWith( - username: username, - email: email, - password: password, - passwordConfirmation: passwordConfirmation, - submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, - ); - - emit(newState); - - if (isFormValid) { - try { - await userRepository.signUp( - username.value, - email.value, - password.value, - ); - final newState = state.copyWith( - submissionStatus: SubmissionStatus.success, - ); - emit(newState); - } catch (error) { - final newState = state.copyWith( - submissionStatus: error is! UsernameAlreadyTakenException && - error is! EmailAlreadyRegisteredException - ? SubmissionStatus.error - : SubmissionStatus.idle, - username: error is UsernameAlreadyTakenException - ? Username.validated( - username.value, - isAlreadyRegistered: true, - ) - : state.username, - email: error is EmailAlreadyRegisteredException - ? Email.validated( - email.value, - isAlreadyRegistered: true, - ) - : state.email, - ); - - emit(newState); - } - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_screen.dart deleted file mode 100644 index 00cc6d8f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_screen.dart +++ /dev/null @@ -1,282 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:sign_up/src/l10n/sign_up_localizations.dart'; -import 'package:sign_up/src/sign_up_cubit.dart'; -import 'package:user_repository/user_repository.dart'; - -class SignUpScreen extends StatelessWidget { - const SignUpScreen({ - required this.userRepository, - required this.onSignUpSuccess, - Key? key, - }) : super(key: key); - - final UserRepository userRepository; - final VoidCallback onSignUpSuccess; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => SignUpCubit( - userRepository: userRepository, - ), - child: SignUpView( - onSignUpSuccess: onSignUpSuccess, - ), - ); - } -} - -@visibleForTesting -class SignUpView extends StatelessWidget { - const SignUpView({ - required this.onSignUpSuccess, - Key? key, - }) : super(key: key); - - final VoidCallback onSignUpSuccess; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - SignUpLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _SignUpForm( - onSignUpSuccess: onSignUpSuccess, - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _SignUpForm extends StatefulWidget { - const _SignUpForm({ - required this.onSignUpSuccess, - Key? key, - }) : super(key: key); - - final VoidCallback onSignUpSuccess; - - @override - State<_SignUpForm> createState() => _SignUpFormState(); -} - -class _SignUpFormState extends State<_SignUpForm> { - final _usernameFocusNode = FocusNode(); - final _emailFocusNode = FocusNode(); - final _passwordFocusNode = FocusNode(); - final _passwordConfirmationFocusNode = FocusNode(); - - @override - void initState() { - super.initState(); - _setUpEmailFieldFocusListener(); - _setUpUsernameFieldFocusListener(); - _setUpPasswordFieldFocusListener(); - _setUpPasswordConfirmationFieldFocusListener(); - } - - void _setUpEmailFieldFocusListener() { - _emailFocusNode.addListener(() { - if (!_emailFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onEmailUnfocused(); - } - }); - } - - void _setUpUsernameFieldFocusListener() { - _usernameFocusNode.addListener(() { - if (!_usernameFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onUsernameUnfocused(); - } - }); - } - - void _setUpPasswordFieldFocusListener() { - _passwordFocusNode.addListener(() { - if (!_passwordFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onPasswordUnfocused(); - } - }); - } - - void _setUpPasswordConfirmationFieldFocusListener() { - _passwordConfirmationFocusNode.addListener(() { - if (!_passwordConfirmationFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onPasswordConfirmationUnfocused(); - } - }); - } - - @override - Widget build(BuildContext context) { - return BlocConsumer( - listenWhen: (oldState, newState) => - oldState.submissionStatus != newState.submissionStatus, - listener: (context, state) { - if (state.submissionStatus == SubmissionStatus.success) { - widget.onSignUpSuccess(); - return; - } - - if (state.submissionStatus == SubmissionStatus.error) { - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar( - const GenericErrorSnackBar(), - ); - } - }, - builder: (context, state) { - final l10n = SignUpLocalizations.of(context); - final cubit = context.read(); - final emailError = state.email.invalid ? state.email.error : null; - final usernameError = - state.username.invalid ? state.username.error : null; - final passwordError = - state.password.invalid ? state.password.error : null; - final passwordConfirmationError = state.passwordConfirmation.invalid - ? state.passwordConfirmation.error - : null; - final isSubmissionInProgress = - state.submissionStatus == SubmissionStatus.inProgress; - return Column( - children: [ - TextField( - focusNode: _emailFocusNode, - onChanged: cubit.onEmailChanged, - textInputAction: TextInputAction.next, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.alternate_email, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null - ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : (emailError == EmailValidationError.alreadyRegistered - ? l10n.emailTextFieldAlreadyRegisteredErrorMessage - : l10n.emailTextFieldInvalidErrorMessage)), - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextField( - focusNode: _usernameFocusNode, - onChanged: cubit.onUsernameChanged, - textInputAction: TextInputAction.next, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.person, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.usernameTextFieldLabel, - errorText: usernameError == null - ? null - : (usernameError == UsernameValidationError.empty - ? l10n.usernameTextFieldEmptyErrorMessage - : (usernameError == UsernameValidationError.alreadyTaken - ? l10n.usernameTextFieldAlreadyTakenErrorMessage - : l10n.usernameTextFieldInvalidErrorMessage)), - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextField( - focusNode: _passwordFocusNode, - onChanged: cubit.onPasswordChanged, - textInputAction: TextInputAction.next, - obscureText: true, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.password, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.passwordTextFieldLabel, - errorText: passwordError == null - ? null - : (passwordError == PasswordValidationError.empty - ? l10n.passwordTextFieldEmptyErrorMessage - : l10n.passwordTextFieldInvalidErrorMessage), - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextField( - focusNode: _passwordConfirmationFocusNode, - onChanged: cubit.onPasswordConfirmationChanged, - onEditingComplete: cubit.onSubmit, - obscureText: true, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.password, - ), - enabled: !isSubmissionInProgress, - labelText: l10n.passwordConfirmationTextFieldLabel, - errorText: passwordConfirmationError == null - ? null - : (passwordConfirmationError == - PasswordConfirmationValidationError.empty - ? l10n.passwordConfirmationTextFieldEmptyErrorMessage - : l10n - .passwordConfirmationTextFieldInvalidErrorMessage), - ), - ), - const SizedBox( - height: Spacing.xxxLarge, - ), - isSubmissionInProgress - ? ExpandedElevatedButton.inProgress( - label: l10n.signUpButtonLabel, - ) - : ExpandedElevatedButton( - onTap: cubit.onSubmit, - label: l10n.signUpButtonLabel, - icon: const Icon( - Icons.login, - ), - ), - ], - ); - }, - ); - } - - @override - void dispose() { - _emailFocusNode.dispose(); - _usernameFocusNode.dispose(); - _passwordFocusNode.dispose(); - _passwordConfirmationFocusNode.dispose(); - super.dispose(); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_state.dart deleted file mode 100644 index 4da10fc1..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/lib/src/sign_up_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -part of 'sign_up_cubit.dart'; - -class SignUpState extends Equatable { - const SignUpState({ - this.email = const Email.unvalidated(), - this.username = const Username.unvalidated(), - this.password = const Password.unvalidated(), - this.passwordConfirmation = const PasswordConfirmation.unvalidated(), - this.submissionStatus = SubmissionStatus.idle, - }); - - final Email email; - final Username username; - final Password password; - final PasswordConfirmation passwordConfirmation; - final SubmissionStatus submissionStatus; - - SignUpState copyWith({ - Email? email, - Username? username, - Password? password, - PasswordConfirmation? passwordConfirmation, - SubmissionStatus? submissionStatus, - }) { - return SignUpState( - email: email ?? this.email, - username: username ?? this.username, - password: password ?? this.password, - passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - submissionStatus: submissionStatus ?? this.submissionStatus, - ); - } - - @override - List get props => [ - email, - username, - password, - passwordConfirmation, - submissionStatus, - ]; -} - -enum SubmissionStatus { - idle, - inProgress, - success, - error, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/pubspec.yaml deleted file mode 100644 index bf170f01..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/pubspec.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: sign_up -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 - user_repository: - path: ../../user_repository - form_fields: - path: ../../form_fields - domain_models: - path: ../../domain_models - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/sign_up/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/analysis_options.yaml deleted file mode 100644 index a3be6b82..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/l10n.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/l10n.yaml deleted file mode 100644 index c498a47b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: update_profile_localizations.dart -output-class: UpdateProfileLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/messages_en.arb b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/messages_en.arb deleted file mode 100644 index c66d0109..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "appBarTitle": "Update Profile", - "updateProfileButtonLabel": "Update", - "usernameTextFieldLabel": "Username", - "usernameTextFieldEmptyErrorMessage": "Your username can't be empty.", - "usernameTextFieldInvalidErrorMessage": "Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).", - "usernameTextFieldAlreadyTakenErrorMessage": "This username is already taken.", - "emailTextFieldLabel": "Email", - "emailTextFieldEmptyErrorMessage": "Your email can't be empty.", - "emailTextFieldInvalidErrorMessage": "This email is not valid.", - "emailTextFieldAlreadyRegisteredErrorMessage": "This email is already registered.", - "passwordTextFieldLabel": "New Password", - "passwordTextFieldInvalidErrorMessage": "Password must be at least five characters long.", - "passwordConfirmationTextFieldLabel": "New Password Confirmation", - "passwordConfirmationTextFieldInvalidErrorMessage": "Your passwords don't match." -} \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart deleted file mode 100644 index a92fba7e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ /dev/null @@ -1,211 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'update_profile_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned -/// by `UpdateProfileLocalizations.of(context)`. -/// -/// Applications need to include `UpdateProfileLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/update_profile_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: UpdateProfileLocalizations.localizationsDelegates, -/// supportedLocales: UpdateProfileLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the UpdateProfileLocalizations.supportedLocales -/// property. -abstract class UpdateProfileLocalizations { - UpdateProfileLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static UpdateProfileLocalizations of(BuildContext context) { - return Localizations.of( - context, UpdateProfileLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _UpdateProfileLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @appBarTitle. - /// - /// In en, this message translates to: - /// **'Update Profile'** - String get appBarTitle; - - /// No description provided for @updateProfileButtonLabel. - /// - /// In en, this message translates to: - /// **'Update'** - String get updateProfileButtonLabel; - - /// No description provided for @usernameTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Username'** - String get usernameTextFieldLabel; - - /// No description provided for @usernameTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your username can\'t be empty.'** - String get usernameTextFieldEmptyErrorMessage; - - /// No description provided for @usernameTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).'** - String get usernameTextFieldInvalidErrorMessage; - - /// No description provided for @usernameTextFieldAlreadyTakenErrorMessage. - /// - /// In en, this message translates to: - /// **'This username is already taken.'** - String get usernameTextFieldAlreadyTakenErrorMessage; - - /// No description provided for @emailTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Email'** - String get emailTextFieldLabel; - - /// No description provided for @emailTextFieldEmptyErrorMessage. - /// - /// In en, this message translates to: - /// **'Your email can\'t be empty.'** - String get emailTextFieldEmptyErrorMessage; - - /// No description provided for @emailTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is not valid.'** - String get emailTextFieldInvalidErrorMessage; - - /// No description provided for @emailTextFieldAlreadyRegisteredErrorMessage. - /// - /// In en, this message translates to: - /// **'This email is already registered.'** - String get emailTextFieldAlreadyRegisteredErrorMessage; - - /// No description provided for @passwordTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Password'** - String get passwordTextFieldLabel; - - /// No description provided for @passwordTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Password must be at least five characters long.'** - String get passwordTextFieldInvalidErrorMessage; - - /// No description provided for @passwordConfirmationTextFieldLabel. - /// - /// In en, this message translates to: - /// **'Password Confirmation'** - String get passwordConfirmationTextFieldLabel; - - /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. - /// - /// In en, this message translates to: - /// **'Your passwords don\'t match.'** - String get passwordConfirmationTextFieldInvalidErrorMessage; -} - -class _UpdateProfileLocalizationsDelegate - extends LocalizationsDelegate { - const _UpdateProfileLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; -} - -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return UpdateProfileLocalizationsEn(); - } - - throw FlutterError( - 'UpdateProfileLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart deleted file mode 100644 index 3c8eac4d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'update_profile_localizations.dart'; - -/// The translations for English (`en`). -class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { - UpdateProfileLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get appBarTitle => 'Update Profile'; - - @override - String get updateProfileButtonLabel => 'Update'; - - @override - String get usernameTextFieldLabel => 'Username'; - - @override - String get usernameTextFieldEmptyErrorMessage => - 'Your username can\'t be empty.'; - - @override - String get usernameTextFieldInvalidErrorMessage => - 'Your username must be 1-20 characters long and can only contain letters, numbers, and the underscore (_).'; - - @override - String get usernameTextFieldAlreadyTakenErrorMessage => - 'This username is already taken.'; - - @override - String get emailTextFieldLabel => 'Email'; - - @override - String get emailTextFieldEmptyErrorMessage => 'Your email can\'t be empty.'; - - @override - String get emailTextFieldInvalidErrorMessage => 'This email is not valid.'; - - @override - String get emailTextFieldAlreadyRegisteredErrorMessage => - 'This email is already registered.'; - - @override - String get passwordTextFieldLabel => 'Password'; - - @override - String get passwordTextFieldInvalidErrorMessage => - 'Password must be at least five characters long.'; - - @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; - - @override - String get passwordConfirmationTextFieldInvalidErrorMessage => - 'Your passwords don\'t match.'; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_cubit.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_cubit.dart deleted file mode 100644 index 3fedabee..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_cubit.dart +++ /dev/null @@ -1,214 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:user_repository/user_repository.dart'; - -part 'update_profile_state.dart'; - -class UpdateProfileCubit extends Cubit { - UpdateProfileCubit({ - required this.userRepository, - }) : super( - const UpdateProfileInProgress(), - ) { - _fetchUser(); - } - - final UserRepository userRepository; - - void onUsernameChanged(String newValue) { - final currentState = state as UpdateProfileLoaded; - final previousValue = currentState.email; - final shouldValidate = previousValue.invalid; - final newState = currentState.copyWith( - username: shouldValidate - ? Username.validated( - newValue, - isAlreadyRegistered: newValue == previousValue.value - ? previousValue.isAlreadyRegistered - : false, - ) - : Username.unvalidated( - newValue, - ), - ); - - emit(newState); - } - - void onEmailChanged(String newValue) { - final currentState = state as UpdateProfileLoaded; - final previousValue = currentState.email; - final shouldValidate = previousValue.invalid; - final newState = currentState.copyWith( - email: shouldValidate - ? Email.validated( - newValue, - isAlreadyRegistered: newValue == previousValue.value - ? previousValue.isAlreadyRegistered - : false, - ) - : Email.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onPasswordChanged(String newValue) { - final currentState = state as UpdateProfileLoaded; - final previousValue = currentState.password; - final shouldValidate = previousValue.invalid && newValue.isNotEmpty; - final newState = currentState.copyWith( - password: shouldValidate - ? OptionalPassword.validated( - newValue, - ) - : OptionalPassword.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onPasswordConfirmationChanged(String newValue) { - final currentState = state as UpdateProfileLoaded; - final previousValue = currentState.passwordConfirmation; - final shouldValidate = previousValue.invalid; - final newState = currentState.copyWith( - passwordConfirmation: shouldValidate - ? OptionalPasswordConfirmation.validated( - newValue, - password: currentState.password, - ) - : OptionalPasswordConfirmation.unvalidated( - newValue, - ), - ); - emit(newState); - } - - void onUsernameUnfocused() { - final currentState = state as UpdateProfileLoaded; - final newState = currentState.copyWith( - username: Username.validated( - currentState.username.value, - isAlreadyRegistered: currentState.username.isAlreadyRegistered, - ), - ); - emit(newState); - } - - void onEmailUnfocused() { - final currentState = state as UpdateProfileLoaded; - final newState = currentState.copyWith( - email: Email.validated( - currentState.email.value, - isAlreadyRegistered: currentState.email.isAlreadyRegistered, - ), - ); - emit(newState); - } - - void onPasswordUnfocused() { - final currentState = state as UpdateProfileLoaded; - final newState = currentState.copyWith( - password: OptionalPassword.validated( - currentState.password.value, - ), - ); - emit(newState); - } - - void onPasswordConfirmationUnfocused() { - final currentState = state as UpdateProfileLoaded; - final confirmation = OptionalPasswordConfirmation.validated( - currentState.passwordConfirmation.value, - password: currentState.password, - ); - final newState = currentState.copyWith( - passwordConfirmation: confirmation, - ); - emit(newState); - } - - void onSubmit() async { - final currentState = state as UpdateProfileLoaded; - final username = Username.validated( - currentState.username.value, - isAlreadyRegistered: currentState.username.isAlreadyRegistered, - ); - final email = Email.validated( - currentState.email.value, - isAlreadyRegistered: currentState.email.isAlreadyRegistered, - ); - final password = OptionalPassword.validated( - currentState.password.value, - ); - final passwordConfirmation = OptionalPasswordConfirmation.validated( - currentState.passwordConfirmation.value, - password: password, - ); - final isFormValid = Formz.validate([ - username, - email, - password, - passwordConfirmation, - ]) == - FormzStatus.valid; - final newState = currentState.copyWith( - username: username, - email: email, - password: password, - passwordConfirmation: passwordConfirmation, - submissionStatus: isFormValid ? SubmissionStatus.inProgress : null, - ); - emit(newState); - - if (isFormValid) { - try { - await userRepository.updateProfile( - username.value, - email.value, - password.value, - ); - final newState = currentState.copyWith( - submissionStatus: SubmissionStatus.success, - ); - emit(newState); - } catch (error) { - final newState = currentState.copyWith( - submissionStatus: error is! UsernameAlreadyTakenException && - error is! EmailAlreadyRegisteredException - ? SubmissionStatus.error - : SubmissionStatus.idle, - username: error is UsernameAlreadyTakenException - ? Username.validated( - username.value, - isAlreadyRegistered: true, - ) - : null, - email: error is EmailAlreadyRegisteredException - ? Email.validated( - email.value, - isAlreadyRegistered: true, - ) - : null, - ); - emit(newState); - } - } - } - - Future _fetchUser() async { - final user = await userRepository.getUser().first; - if (user != null) { - final newState = UpdateProfileLoaded( - username: Username.unvalidated(user.username), - email: Email.unvalidated(user.email), - ); - emit(newState); - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_screen.dart deleted file mode 100644 index 93693318..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_screen.dart +++ /dev/null @@ -1,271 +0,0 @@ -import 'package:component_library/component_library.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:form_fields/form_fields.dart'; -import 'package:update_profile/src/l10n/update_profile_localizations.dart'; -import 'package:update_profile/src/update_profile_cubit.dart'; -import 'package:user_repository/user_repository.dart'; - -class UpdateProfileScreen extends StatelessWidget { - const UpdateProfileScreen({ - required this.userRepository, - required this.onUpdateProfileSuccess, - Key? key, - }) : super(key: key); - - final UserRepository userRepository; - final VoidCallback onUpdateProfileSuccess; - - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (_) => UpdateProfileCubit( - userRepository: userRepository, - ), - child: UpdateProfileView( - onUpdateProfileSuccess: onUpdateProfileSuccess, - ), - ); - } -} - -@visibleForTesting -class UpdateProfileView extends StatelessWidget { - const UpdateProfileView({ - required this.onUpdateProfileSuccess, - Key? key, - }) : super(key: key); - - final VoidCallback onUpdateProfileSuccess; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => _releaseFocus(context), - child: Scaffold( - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - title: Text( - UpdateProfileLocalizations.of(context).appBarTitle, - ), - ), - body: SingleChildScrollView( - padding: const EdgeInsets.only( - left: Spacing.mediumLarge, - right: Spacing.mediumLarge, - top: Spacing.mediumLarge, - ), - child: _UpdateProfileForm( - onUpdateProfileSuccess: onUpdateProfileSuccess, - ), - ), - ), - ); - } - - void _releaseFocus(BuildContext context) => FocusScope.of(context).unfocus(); -} - -class _UpdateProfileForm extends StatefulWidget { - const _UpdateProfileForm({ - required this.onUpdateProfileSuccess, - Key? key, - }) : super(key: key); - - final VoidCallback onUpdateProfileSuccess; - - @override - State<_UpdateProfileForm> createState() => _UpdateProfileFormState(); -} - -class _UpdateProfileFormState extends State<_UpdateProfileForm> { - final _usernameFocusNode = FocusNode(); - final _emailFocusNode = FocusNode(); - final _passwordFocusNode = FocusNode(); - final _passwordConfirmationFocusNode = FocusNode(); - - @override - void initState() { - super.initState(); - _usernameFocusNode.addListener(() { - if (!_usernameFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onUsernameUnfocused(); - } - }); - _emailFocusNode.addListener(() { - if (!_emailFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onEmailUnfocused(); - } - }); - _passwordFocusNode.addListener(() { - if (!_passwordFocusNode.hasFocus) { - final cubit = context.read(); - cubit.onPasswordUnfocused(); - } - }); - _passwordConfirmationFocusNode.addListener(() { - if (!_passwordConfirmationFocusNode.hasFocus) { - final bloc = context.read(); - bloc.onPasswordConfirmationUnfocused(); - } - }); - } - - @override - Widget build(BuildContext context) { - return BlocConsumer( - listenWhen: (oldState, newState) => - (oldState is UpdateProfileLoaded - ? oldState.submissionStatus - : null) != - (newState is UpdateProfileLoaded ? newState.submissionStatus : null), - listener: (context, state) { - if (state is UpdateProfileLoaded) { - if (state.submissionStatus == SubmissionStatus.success) { - widget.onUpdateProfileSuccess(); - return; - } - - if (state.submissionStatus == SubmissionStatus.error) { - ScaffoldMessenger.of(context) - ..hideCurrentSnackBar() - ..showSnackBar( - const GenericErrorSnackBar(), - ); - } - } - }, - builder: (context, state) { - final l10n = UpdateProfileLocalizations.of(context); - if (state is UpdateProfileLoaded) { - final usernameError = - state.username.invalid ? state.username.error : null; - final emailError = state.email.invalid ? state.email.error : null; - final passwordError = - state.password.invalid ? state.password.error : null; - final passwordConfirmationError = state.passwordConfirmation.invalid - ? state.passwordConfirmation.error - : null; - final cubit = context.read(); - return Column( - children: [ - TextFormField( - focusNode: _usernameFocusNode, - initialValue: state.username.value, - onChanged: cubit.onUsernameChanged, - textInputAction: TextInputAction.next, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.person, - ), - enabled: !state.isSubmissionInProgress, - labelText: l10n.usernameTextFieldLabel, - errorText: usernameError == null - ? null - : (usernameError == UsernameValidationError.empty - ? l10n.usernameTextFieldEmptyErrorMessage - : (usernameError == - UsernameValidationError.alreadyTaken - ? l10n.usernameTextFieldAlreadyTakenErrorMessage - : l10n.usernameTextFieldInvalidErrorMessage)), - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextFormField( - focusNode: _emailFocusNode, - initialValue: state.email.value, - onChanged: cubit.onEmailChanged, - textInputAction: TextInputAction.next, - autocorrect: false, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.alternate_email, - ), - enabled: !state.isSubmissionInProgress, - labelText: l10n.emailTextFieldLabel, - errorText: emailError == null - ? null - : (emailError == EmailValidationError.empty - ? l10n.emailTextFieldEmptyErrorMessage - : (emailError == - EmailValidationError.alreadyRegistered - ? l10n.emailTextFieldAlreadyRegisteredErrorMessage - : l10n.emailTextFieldInvalidErrorMessage)), - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextField( - focusNode: _passwordFocusNode, - onChanged: cubit.onPasswordChanged, - textInputAction: TextInputAction.next, - obscureText: true, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.password, - ), - enabled: !state.isSubmissionInProgress, - labelText: l10n.passwordTextFieldLabel, - errorText: passwordError == null - ? null - : l10n.passwordTextFieldInvalidErrorMessage, - ), - ), - const SizedBox( - height: Spacing.mediumLarge, - ), - TextField( - focusNode: _passwordConfirmationFocusNode, - onChanged: cubit.onPasswordConfirmationChanged, - onEditingComplete: cubit.onSubmit, - obscureText: true, - decoration: InputDecoration( - suffixIcon: const Icon( - Icons.password, - ), - enabled: !state.isSubmissionInProgress, - labelText: l10n.passwordConfirmationTextFieldLabel, - errorText: passwordConfirmationError == null - ? null - : l10n.passwordConfirmationTextFieldInvalidErrorMessage, - ), - ), - const SizedBox( - height: Spacing.xxxLarge, - ), - state.isSubmissionInProgress - ? ExpandedElevatedButton.inProgress( - label: l10n.updateProfileButtonLabel, - ) - : ExpandedElevatedButton( - onTap: cubit.onSubmit, - label: l10n.updateProfileButtonLabel, - icon: const Icon( - Icons.login, - ), - ), - ], - ); - } else { - return const CenteredCircularProgressIndicator(); - } - }, - ); - } - - @override - void dispose() { - _usernameFocusNode.dispose(); - _emailFocusNode.dispose(); - _passwordFocusNode.dispose(); - _passwordConfirmationFocusNode.dispose(); - super.dispose(); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_state.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_state.dart deleted file mode 100644 index c6748888..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/src/update_profile_state.dart +++ /dev/null @@ -1,64 +0,0 @@ -part of 'update_profile_cubit.dart'; - -abstract class UpdateProfileState extends Equatable { - const UpdateProfileState(); - - @override - List get props => []; -} - -class UpdateProfileInProgress extends UpdateProfileState { - const UpdateProfileInProgress(); -} - -class UpdateProfileLoaded extends UpdateProfileState { - const UpdateProfileLoaded({ - required this.email, - required this.username, - this.password = const OptionalPassword.unvalidated(), - this.passwordConfirmation = - const OptionalPasswordConfirmation.unvalidated(), - this.submissionStatus = SubmissionStatus.idle, - }); - - final Email email; - final Username username; - final OptionalPassword password; - final OptionalPasswordConfirmation passwordConfirmation; - final SubmissionStatus submissionStatus; - - bool get isSubmissionInProgress => - submissionStatus == SubmissionStatus.inProgress; - - UpdateProfileLoaded copyWith({ - Email? email, - Username? username, - OptionalPassword? password, - OptionalPasswordConfirmation? passwordConfirmation, - SubmissionStatus? submissionStatus, - }) { - return UpdateProfileLoaded( - email: email ?? this.email, - username: username ?? this.username, - password: password ?? this.password, - passwordConfirmation: passwordConfirmation ?? this.passwordConfirmation, - submissionStatus: submissionStatus ?? this.submissionStatus, - ); - } - - @override - List get props => [ - email, - username, - password, - passwordConfirmation, - submissionStatus, - ]; -} - -enum SubmissionStatus { - idle, - inProgress, - success, - error, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/update_profile.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/update_profile.dart deleted file mode 100644 index 0d728ead..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/lib/update_profile.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'src/l10n/update_profile_localizations.dart'; -export 'src/update_profile_screen.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/pubspec.yaml deleted file mode 100644 index 11b78caf..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/pubspec.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: update_profile -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - component_library: - path: ../../component_library - flutter: - sdk: flutter - flutter_bloc: ^8.0.1 - user_repository: - path: ../../user_repository - form_fields: - path: ../../form_fields - domain_models: - path: ../../domain_models - -dev_dependencies: - flutter_test: - sdk: flutter - mocktail: 0.1.4 - test: ^1.16.8 - flutter_lints: ^1.0.4 - -flutter: - generate: true - uses-material-design: true \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/test/widget_test.dart deleted file mode 100644 index 6a0e9fc2..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/features/update_profile/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('Forgot my password', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/form_fields.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/form_fields.dart deleted file mode 100644 index ba899732..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/form_fields.dart +++ /dev/null @@ -1,9 +0,0 @@ -export 'package:formz/formz.dart' - show FormzInput, FormzStatus, Formz, FormzStatusX; - -export 'src/email.dart'; -export 'src/optional_password.dart'; -export 'src/optional_password_confirmation.dart'; -export 'src/password.dart'; -export 'src/password_confirmation.dart'; -export 'src/username.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/email.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/email.dart deleted file mode 100644 index a5933abb..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/email.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:formz/formz.dart'; - -class Email extends FormzInput - with EquatableMixin { - const Email.unvalidated([ - String value = '', - ]) : isAlreadyRegistered = false, - super.pure(value); - - const Email.validated( - String value, { - this.isAlreadyRegistered = false, - }) : super.dirty(value); - - static final _emailRegex = RegExp( - '^(([\\w-]+\\.)+[\\w-]+|([a-zA-Z]|[\\w-]{2,}))@((([0-1]?' - '[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.' - '([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])' - ')|([a-zA-Z]+[\\w-]+\\.)+[a-zA-Z]{2,4})\$', - ); - - final bool isAlreadyRegistered; - - @override - EmailValidationError? validator(String value) { - return value.isEmpty - ? EmailValidationError.empty - : (isAlreadyRegistered - ? EmailValidationError.alreadyRegistered - : (_emailRegex.hasMatch(value) - ? null - : EmailValidationError.invalid)); - } - - @override - List get props => [ - value, - pure, - isAlreadyRegistered, - ]; -} - -enum EmailValidationError { - empty, - invalid, - alreadyRegistered, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password.dart deleted file mode 100644 index 0f230b6e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:formz/formz.dart'; - -/// Represents an optional password field. -/// -/// Useful when the password can or can't be changed, such as in the update -/// profile screen. -class OptionalPassword - extends FormzInput { - const OptionalPassword.unvalidated([ - String value = '', - ]) : super.pure(value); - - const OptionalPassword.validated([ - String value = '', - ]) : super.dirty(value); - - @override - OptionalPasswordValidationError? validator(String value) { - return value.isEmpty - ? null - : (value.length >= 5 && value.length <= 120 - ? null - : OptionalPasswordValidationError.invalid); - } -} - -enum OptionalPasswordValidationError { - invalid, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password_confirmation.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password_confirmation.dart deleted file mode 100644 index 70365b8c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/optional_password_confirmation.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:form_fields/form_fields.dart'; - -/// Represents an optional password confirmation field. -/// -/// Used in conjunction with [OptionalPassword] when the password can or can't -/// be changed, such as in the update profile screen. -class OptionalPasswordConfirmation - extends FormzInput - with EquatableMixin { - const OptionalPasswordConfirmation.unvalidated([ - String value = '', - ]) : password = const OptionalPassword.unvalidated(), - super.pure(value); - - const OptionalPasswordConfirmation.validated( - String value, { - required this.password, - }) : super.dirty(value); - - final OptionalPassword password; - - @override - OptionalPasswordConfirmationValidationError? validator(String value) { - return value.isEmpty - ? (password.value.isEmpty - ? null - : OptionalPasswordConfirmationValidationError.empty) - : (value == password.value - ? null - : OptionalPasswordConfirmationValidationError.invalid); - } - - @override - List get props => [ - value, - pure, - password, - ]; -} - -enum OptionalPasswordConfirmationValidationError { - empty, - invalid, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password.dart deleted file mode 100644 index 9ac850ca..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:formz/formz.dart'; - -class Password extends FormzInput { - const Password.unvalidated([ - String value = '', - ]) : super.pure(value); - - const Password.validated([ - String value = '', - ]) : super.dirty(value); - - @override - PasswordValidationError? validator(String value) { - if (value.isEmpty) { - return PasswordValidationError.empty; - } else if (value.length < 5 || value.length > 120) { - return PasswordValidationError.invalid; - } else { - return null; - } - } -} - -enum PasswordValidationError { - empty, - invalid, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password_confirmation.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password_confirmation.dart deleted file mode 100644 index abb485ec..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/password_confirmation.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:form_fields/form_fields.dart'; - -class PasswordConfirmation - extends FormzInput - with EquatableMixin { - const PasswordConfirmation.unvalidated([ - String value = '', - ]) : password = const Password.unvalidated(), - super.pure(value); - - const PasswordConfirmation.validated( - String value, { - required this.password, - }) : super.dirty(value); - - final Password password; - - @override - PasswordConfirmationValidationError? validator(String value) { - return value.isEmpty - ? PasswordConfirmationValidationError.empty - : (value == password.value - ? null - : PasswordConfirmationValidationError.invalid); - } - - @override - List get props => [ - value, - pure, - password, - ]; -} - -enum PasswordConfirmationValidationError { - empty, - invalid, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/username.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/username.dart deleted file mode 100644 index 453ec1b8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/lib/src/username.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:formz/formz.dart'; - -class Username extends FormzInput - with EquatableMixin { - const Username.unvalidated([ - String value = '', - ]) : isAlreadyRegistered = false, - super.pure(value); - - const Username.validated( - String value, { - this.isAlreadyRegistered = false, - }) : super.dirty(value); - - static final _usernameRegex = RegExp( - r'^(?=.{1,20}$)(?![_])(?!.*[_.]{2})[a-zA-Z0-9_]+(? get props => [ - value, - pure, - isAlreadyRegistered, - ]; -} - -enum UsernameValidationError { - empty, - invalid, - alreadyTaken, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/pubspec.yaml deleted file mode 100644 index feed53bc..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/pubspec.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: form_fields -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - formz: ^0.4.1 - equatable: ^2.0.3 - -dev_dependencies: - lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/form_fields/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/key_value_storage.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/key_value_storage.dart deleted file mode 100644 index d1006080..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/key_value_storage.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'package:hive/hive.dart'; -export 'src/key_value_storage.dart'; -export 'src/models/models.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/key_value_storage.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/key_value_storage.dart deleted file mode 100644 index e527f2cd..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/key_value_storage.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:key_value_storage/key_value_storage.dart'; -import 'package:meta/meta.dart'; -import 'package:path_provider/path_provider.dart'; - -/// Wraps [Hive] so that we can register all adapters and manage all keys in a -/// single place. -/// -/// To use this class, simply unwrap one of its exposed boxes, like -/// [quoteListPageBox], and execute operations in it, for example: -/// -/// ``` -/// (await quoteListPageBox).clear(); -/// ``` -/// -/// Storing non-primitive types in Hive requires us to use incremental [typeId]s. -/// Having all these models and boxes' keys in a single package allows us to -/// avoid conflicts. -class KeyValueStorage { - static const _quoteListPagesBoxKey = 'quote-list-pages'; - static const _favoriteQuoteListPagesBoxKey = 'favorite-quote-list-pages'; - static const _darkModePreferenceBoxKey = 'dark-mode-preference'; - - KeyValueStorage({ - @visibleForTesting HiveInterface? hive, - }) : _hive = hive ?? Hive { - try { - _hive - ..registerAdapter(QuoteListPageCMAdapter()) - ..registerAdapter(QuoteCMAdapter()) - ..registerAdapter(DarkModePreferenceCMAdapter()); - } catch (_) { - throw Exception( - 'You shouldn\'t have more than one [KeyValueStorage] instance in your ' - 'project'); - } - } - - final HiveInterface _hive; - - Future> get quoteListPageBox => - _openHiveBox( - _quoteListPagesBoxKey, - isTemporary: true, - ); - - Future> get favoriteQuoteListPageBox => - _openHiveBox( - _favoriteQuoteListPagesBoxKey, - isTemporary: true, - ); - - Future> get darkModePreferenceBox => - _openHiveBox( - _darkModePreferenceBoxKey, - isTemporary: false, - ); - - Future> _openHiveBox( - String boxKey, { - required bool isTemporary, - }) async { - if (_hive.isBoxOpen(boxKey)) { - return _hive.box(boxKey); - } else { - final directory = await (isTemporary - ? getTemporaryDirectory() - : getApplicationDocumentsDirectory()); - return _hive.openBox( - boxKey, - path: directory.path, - ); - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.dart deleted file mode 100644 index 04857d28..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:hive/hive.dart'; - -part 'dark_mode_preference_cm.g.dart'; - -@HiveType(typeId: 3) -enum DarkModePreferenceCM { - @HiveField(0) - alwaysDark, - @HiveField(1) - alwaysLight, - @HiveField(2) - accordingToSystemPreferences -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.g.dart deleted file mode 100644 index 4bbe01e8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/dark_mode_preference_cm.g.dart +++ /dev/null @@ -1,51 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'dark_mode_preference_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class DarkModePreferenceCMAdapter extends TypeAdapter { - @override - final int typeId = 3; - - @override - DarkModePreferenceCM read(BinaryReader reader) { - switch (reader.readByte()) { - case 0: - return DarkModePreferenceCM.alwaysDark; - case 1: - return DarkModePreferenceCM.alwaysLight; - case 2: - return DarkModePreferenceCM.accordingToSystemPreferences; - default: - return DarkModePreferenceCM.alwaysDark; - } - } - - @override - void write(BinaryWriter writer, DarkModePreferenceCM obj) { - switch (obj) { - case DarkModePreferenceCM.alwaysDark: - writer.writeByte(0); - break; - case DarkModePreferenceCM.alwaysLight: - writer.writeByte(1); - break; - case DarkModePreferenceCM.accordingToSystemPreferences: - writer.writeByte(2); - break; - } - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is DarkModePreferenceCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/models.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/models.dart deleted file mode 100644 index 28f9e853..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/models.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'dark_mode_preference_cm.dart'; -export 'quote_cm.dart'; -export 'quote_list_page_cm.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.dart deleted file mode 100644 index 00d9f2fb..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:hive/hive.dart'; - -part 'quote_cm.g.dart'; - -@HiveType(typeId: 0) -class QuoteCM { - const QuoteCM({ - required this.id, - required this.body, - required this.favoritesCount, - required this.upvotesCount, - required this.downvotesCount, - this.author, - this.isFavorite, - this.isUpvoted, - this.isDownvoted, - }); - - @HiveField(0) - final int id; - @HiveField(1) - final String body; - @HiveField(2) - final String? author; - @HiveField(3) - final bool? isFavorite; - @HiveField(4) - final bool? isUpvoted; - @HiveField(5) - final bool? isDownvoted; - @HiveField(6) - final int favoritesCount; - @HiveField(7) - final int upvotesCount; - @HiveField(8) - final int downvotesCount; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.g.dart deleted file mode 100644 index 7047e77b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_cm.g.dart +++ /dev/null @@ -1,65 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quote_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class QuoteCMAdapter extends TypeAdapter { - @override - final int typeId = 0; - - @override - QuoteCM read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return QuoteCM( - id: fields[0] as int, - body: fields[1] as String, - favoritesCount: fields[6] as int, - upvotesCount: fields[7] as int, - downvotesCount: fields[8] as int, - author: fields[2] as String?, - isFavorite: fields[3] as bool?, - isUpvoted: fields[4] as bool?, - isDownvoted: fields[5] as bool?, - ); - } - - @override - void write(BinaryWriter writer, QuoteCM obj) { - writer - ..writeByte(9) - ..writeByte(0) - ..write(obj.id) - ..writeByte(1) - ..write(obj.body) - ..writeByte(2) - ..write(obj.author) - ..writeByte(3) - ..write(obj.isFavorite) - ..writeByte(4) - ..write(obj.isUpvoted) - ..writeByte(5) - ..write(obj.isDownvoted) - ..writeByte(6) - ..write(obj.favoritesCount) - ..writeByte(7) - ..write(obj.upvotesCount) - ..writeByte(8) - ..write(obj.downvotesCount); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is QuoteCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.dart deleted file mode 100644 index 2808d657..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:hive/hive.dart'; -import 'package:key_value_storage/src/models/models.dart'; - -part 'quote_list_page_cm.g.dart'; - -@HiveType(typeId: 1) -class QuoteListPageCM { - const QuoteListPageCM({ - required this.isLastPage, - required this.quoteList, - }); - - @HiveField(0) - final bool isLastPage; - @HiveField(1) - final List quoteList; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.g.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.g.dart deleted file mode 100644 index ebd6dd9d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/lib/src/models/quote_list_page_cm.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'quote_list_page_cm.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class QuoteListPageCMAdapter extends TypeAdapter { - @override - final int typeId = 1; - - @override - QuoteListPageCM read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = { - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return QuoteListPageCM( - isLastPage: fields[0] as bool, - quoteList: (fields[1] as List).cast(), - ); - } - - @override - void write(BinaryWriter writer, QuoteListPageCM obj) { - writer - ..writeByte(2) - ..writeByte(0) - ..write(obj.isLastPage) - ..writeByte(1) - ..write(obj.quoteList); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is QuoteListPageCMAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/pubspec.yaml deleted file mode 100644 index bca9f9c8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/pubspec.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: key_value_storage -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - hive: 2.0.4 - path_provider: ^2.0.2 - -dev_dependencies: - build_runner: ^2.0.5 - hive_generator: ^1.1.0 - lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/key_value_storage/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/monitoring.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/monitoring.dart deleted file mode 100644 index d2d3fba8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/monitoring.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:firebase_core/firebase_core.dart'; - -export 'src/dynamic_link_service.dart'; -export 'src/analytics_service.dart'; -export 'src/error_reporting_service.dart'; -export 'src/remote_value_service.dart'; - -Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/analytics_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/analytics_service.dart deleted file mode 100644 index dcc3a202..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/analytics_service.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:flutter/foundation.dart'; - -/// Wrapper around [FirebaseAnalytics]. -class AnalyticsService { - AnalyticsService({ - @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); - - final FirebaseAnalytics _analytics; - - Future setCurrentScreen(String screenName) { - return _analytics.setCurrentScreen( - screenName: screenName, - ); - } - - Future logEvent({ - required String name, - Map? parameters, - }) { - return _analytics.logEvent( - name: name, - parameters: parameters, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/dynamic_link_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/dynamic_link_service.dart deleted file mode 100644 index d1de7469..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/dynamic_link_service.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; -import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; - -export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' - show SocialMetaTagParameters; - -typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); - -/// Wrapper around [FirebaseDynamicLinks]. -class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; - - DynamicLinkService({ - @visibleForTesting FirebaseDynamicLinks? dynamicLinks, - }) : _dynamicLinks = dynamicLinks ?? FirebaseDynamicLinks.instance; - - final FirebaseDynamicLinks _dynamicLinks; - - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - - Future generateDynamicLinkUrl({ - required String path, - SocialMetaTagParameters? socialMetaTagParameters, - }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( - uriPrefix: _domainUriPrefix, - link: Uri.parse( - '$_domainUriPrefix$path', - ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, - ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', - ), - socialMetaTagParameters: socialMetaTagParameters, - ); - - final shortLink = await parameters.buildShortLink(); - return shortLink.shortUrl.toString(); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/error_reporting_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/error_reporting_service.dart deleted file mode 100644 index e841435a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/error_reporting_service.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -import 'package:flutter/foundation.dart'; - -/// Wrapper around [FirebaseCrashlytics]. -class ErrorReportingService { - ErrorReportingService({ - @visibleForTesting FirebaseCrashlytics? crashlytics, - }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; - - final FirebaseCrashlytics _crashlytics; - - Future recordFlutterError(FlutterErrorDetails flutterErrorDetails) { - return _crashlytics.recordFlutterError(flutterErrorDetails); - } - - Future recordError( - dynamic exception, - StackTrace? stack, { - bool fatal = false, - }) { - return _crashlytics.recordError( - exception, - stack, - fatal: fatal, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart deleted file mode 100644 index 3adf95c1..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/lib/src/remote_value_service.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:firebase_remote_config/firebase_remote_config.dart'; -import 'package:flutter/foundation.dart'; - -/// Wrapper around [FirebaseRemoteConfig]. -class RemoteValueService { - static const _gridQuotesViewEnabledKey = 'grid_quotes_view_enabled'; - - RemoteValueService({ - @visibleForTesting FirebaseRemoteConfig? remoteConfig, - }) : _remoteConfig = remoteConfig ?? FirebaseRemoteConfig.instance; - - final FirebaseRemoteConfig _remoteConfig; - - Future load() async { - await _remoteConfig.setDefaults({ - _gridQuotesViewEnabledKey: true, - }); - await _remoteConfig.fetchAndActivate(); - } - - bool get isGridQuotesViewEnabled => _remoteConfig.getBool( - _gridQuotesViewEnabledKey, - ); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/pubspec.yaml deleted file mode 100644 index 68d41253..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/monitoring/pubspec.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: monitoring -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 - firebase_analytics: ^8.3.0 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 - -dev_dependencies: - lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/quote_repository.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/quote_repository.dart deleted file mode 100644 index 4e37023f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/quote_repository.dart +++ /dev/null @@ -1 +0,0 @@ -export 'src/quote_repository.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/cache_to_domain.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/cache_to_domain.dart deleted file mode 100644 index 4bf69d3a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/cache_to_domain.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension QuoteListPageCMtoDomain on QuoteListPageCM { - QuoteListPage toDomainModel() { - return QuoteListPage( - isLastPage: isLastPage, - quoteList: quoteList - .map( - (quote) => quote.toDomainModel(), - ) - .toList(), - ); - } -} - -extension QuoteCMtoDomain on QuoteCM { - Quote toDomainModel() { - return Quote( - id: id, - body: body, - author: author, - favoritesCount: favoritesCount, - upvotesCount: upvotesCount, - downvotesCount: downvotesCount, - isUpvoted: isUpvoted, - isDownvoted: isDownvoted, - isFavorite: isFavorite, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/domain_to_remote.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/domain_to_remote.dart deleted file mode 100644 index 09f1b644..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/domain_to_remote.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:domain_models/domain_models.dart'; - -extension TagDomainToRM on Tag { - String toRemoteModel() { - switch (this) { - case Tag.life: - return 'life'; - case Tag.happiness: - return 'happiness'; - case Tag.work: - return 'work'; - case Tag.nature: - return 'nature'; - case Tag.science: - return 'science'; - case Tag.love: - return 'love'; - case Tag.funny: - return 'funny'; - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/mappers.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/mappers.dart deleted file mode 100644 index 7083627d..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/mappers.dart +++ /dev/null @@ -1,4 +0,0 @@ -export 'cache_to_domain.dart'; -export 'domain_to_remote.dart'; -export 'remote_to_cache.dart'; -export 'remote_to_domain.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_cache.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_cache.dart deleted file mode 100644 index 6dc6dd7b..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_cache.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension QuoteListPageRMtoCM on QuoteListPageRM { - QuoteListPageCM toCacheModel() { - return QuoteListPageCM( - isLastPage: isLastPage, - quoteList: quoteList - .map( - (quote) => quote.toCacheModel(), - ) - .toList(), - ); - } -} - -extension QuoteRMtoCM on QuoteRM { - QuoteCM toCacheModel() { - return QuoteCM( - id: id, - body: body ?? '', - author: author, - favoritesCount: favoritesCount, - upvotesCount: upvotesCount, - downvotesCount: downvotesCount, - isFavorite: userInfo?.isFavorite, - isUpvoted: userInfo?.isUpvoted, - isDownvoted: userInfo?.isDownvoted, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_domain.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_domain.dart deleted file mode 100644 index e6f33422..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/mappers/remote_to_domain.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:fav_qs_api/fav_qs_api.dart'; - -extension QuoteListPageRMtoDomain on QuoteListPageRM { - QuoteListPage toDomainModel() { - return QuoteListPage( - isLastPage: isLastPage, - quoteList: quoteList - .map( - (quote) => quote.toDomainModel(), - ) - .toList(), - ); - } -} - -extension QuoteRMtoDomain on QuoteRM { - Quote toDomainModel() { - return Quote( - id: id, - body: body ?? '', - author: author, - favoritesCount: favoritesCount, - upvotesCount: upvotesCount, - downvotesCount: downvotesCount, - isFavorite: userInfo?.isFavorite, - isUpvoted: userInfo?.isUpvoted, - isDownvoted: userInfo?.isDownvoted, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_local_storage.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_local_storage.dart deleted file mode 100644 index 88c147e8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_local_storage.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:key_value_storage/key_value_storage.dart'; - -class QuoteLocalStorage { - QuoteLocalStorage({ - required this.keyValueStorage, - }); - - final KeyValueStorage keyValueStorage; - - Future upsertQuoteListPage( - int pageNumber, - QuoteListPageCM quoteListPage, - bool favoritesOnly, - ) async { - final box = await (favoritesOnly - ? keyValueStorage.favoriteQuoteListPageBox - : keyValueStorage.quoteListPageBox); - return box.put( - pageNumber, - quoteListPage, - ); - } - - Future clearQuoteListPageList(bool favoritesOnly) async { - final box = await (favoritesOnly - ? keyValueStorage.favoriteQuoteListPageBox - : keyValueStorage.quoteListPageBox); - await box.clear(); - } - - Future clear() async { - await Future.wait([ - keyValueStorage.quoteListPageBox.then( - (box) => box.clear(), - ), - keyValueStorage.favoriteQuoteListPageBox.then( - (box) => box.clear(), - ) - ]); - } - - Future getQuoteListPage( - int pageNumber, - bool favoritesOnly, - ) async { - final box = await (favoritesOnly - ? keyValueStorage.favoriteQuoteListPageBox - : keyValueStorage.quoteListPageBox); - return box.get(pageNumber); - } - - Future getQuote(int id) async { - final favoritesBox = await keyValueStorage.favoriteQuoteListPageBox; - final quotesBox = await keyValueStorage.quoteListPageBox; - - final completeQuoteList = [ - ...quotesBox.values, - ...favoritesBox.values, - ].expand( - (page) => page.quoteList, - ); - try { - return completeQuoteList.firstWhere( - (quote) => quote.id == id, - ); - } catch (_) { - return null; - } - } - - Future updateQuote( - QuoteCM updatedQuote, - bool shouldUpdateFavorites, - ) async { - final favoritesBox = await keyValueStorage.favoriteQuoteListPageBox; - - final quotesBox = await keyValueStorage.quoteListPageBox; - final list = [ - quotesBox.updateQuote(updatedQuote), - if (shouldUpdateFavorites) favoritesBox.updateQuote(updatedQuote), - ]; - await Future.wait( - list, - ); - } -} - -extension on Box { - Future updateQuote( - QuoteCM updatedQuote, - ) async { - final pageList = values.toList(); - try { - final outdatedPage = pageList.firstWhere( - (page) => page.quoteList.any( - (quote) => quote.id == updatedQuote.id, - ), - ); - - final outdatedPageIndex = pageList.indexOf(outdatedPage); - - final updatedQuotePage = QuoteListPageCM( - isLastPage: outdatedPage.isLastPage, - quoteList: outdatedPage.quoteList.map( - (quote) { - if (quote.id == updatedQuote.id) { - return updatedQuote; - } - return quote; - }, - ).toList(), - ); - - // Indexes are zero-based but pageNumbers are not. - final pageNumber = outdatedPageIndex + 1; - return put( - pageNumber, - updatedQuotePage, - ); - } catch (_) {} - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_repository.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_repository.dart deleted file mode 100644 index 1c8065b5..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/lib/src/quote_repository.dart +++ /dev/null @@ -1,218 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; -import 'package:meta/meta.dart'; -import 'package:quote_repository/src/mappers/mappers.dart'; -import 'package:quote_repository/src/quote_local_storage.dart'; - -class QuoteRepository { - QuoteRepository({ - required KeyValueStorage keyValueStorage, - required this.remoteApi, - @visibleForTesting QuoteLocalStorage? localStorage, - }) : _localStorage = localStorage ?? - QuoteLocalStorage( - keyValueStorage: keyValueStorage, - ); - - final FavQsApi remoteApi; - final QuoteLocalStorage _localStorage; - - Stream getQuoteListPage( - int pageNumber, { - Tag? tag, - String searchTerm = '', - String? favoritedByUsername, - required QuoteListPageFetchPolicy fetchPolicy, - }) async* { - final isFilteringByTag = tag != null; - final isSearching = searchTerm.isNotEmpty; - final isFetchPolicyNetworkOnly = - fetchPolicy == QuoteListPageFetchPolicy.networkOnly; - final shouldSkipCacheLookup = - isFilteringByTag || isSearching || isFetchPolicyNetworkOnly; - - if (shouldSkipCacheLookup) { - final freshPage = await _getQuoteListPageFromNetwork( - pageNumber, - tag: tag, - searchTerm: searchTerm, - favoritedByUsername: favoritedByUsername, - ); - - yield freshPage; - } else { - final isFilteringByFavorites = favoritedByUsername != null; - - final cachedPage = await _localStorage.getQuoteListPage( - pageNumber, - isFilteringByFavorites, - ); - - final isFetchPolicyCacheAndNetwork = - fetchPolicy == QuoteListPageFetchPolicy.cacheAndNetwork; - - final isFetchPolicyCachePreferably = - fetchPolicy == QuoteListPageFetchPolicy.cachePreferably; - - final shouldEmitCachedPageInAdvance = - isFetchPolicyCachePreferably || isFetchPolicyCacheAndNetwork; - - if (shouldEmitCachedPageInAdvance && cachedPage != null) { - yield cachedPage.toDomainModel(); - if (isFetchPolicyCachePreferably) { - return; - } - } - - try { - final freshPage = await _getQuoteListPageFromNetwork( - pageNumber, - favoritedByUsername: favoritedByUsername, - ); - - yield freshPage; - } catch (_) { - final isFetchPolicyNetworkPreferably = - fetchPolicy == QuoteListPageFetchPolicy.networkPreferably; - if (cachedPage != null && isFetchPolicyNetworkPreferably) { - yield cachedPage.toDomainModel(); - return; - } - - rethrow; - } - } - } - - Future _getQuoteListPageFromNetwork( - int pageNumber, { - Tag? tag, - String searchTerm = '', - String? favoritedByUsername, - }) async { - try { - final apiPage = await remoteApi.getQuoteListPage( - pageNumber, - tag: tag?.toRemoteModel(), - searchTerm: searchTerm, - favoritedByUsername: favoritedByUsername, - ); - - final isFiltering = tag != null || searchTerm.isNotEmpty; - final favoritesOnly = favoritedByUsername != null; - - final shouldStoreOnCache = !isFiltering; - if (shouldStoreOnCache) { - final shouldEmptyCache = pageNumber == 1; - if (shouldEmptyCache) { - await _localStorage.clearQuoteListPageList(favoritesOnly); - } - - final cachePage = apiPage.toCacheModel(); - await _localStorage.upsertQuoteListPage( - pageNumber, - cachePage, - favoritesOnly, - ); - } - - final domainPage = apiPage.toDomainModel(); - return domainPage; - } on EmptySearchResultFavQsException catch (_) { - throw EmptySearchResultException(); - } - } - - Future getQuoteDetails(int id) async { - final cachedQuote = await _localStorage.getQuote(id); - if (cachedQuote != null) { - return cachedQuote.toDomainModel(); - } else { - final apiQuote = await remoteApi.getQuote(id); - final domainQuote = apiQuote.toDomainModel(); - return domainQuote; - } - } - - Future favoriteQuote(int id) async { - final updatedCacheQuote = - await remoteApi.favoriteQuote(id).toCacheUpdateFuture( - _localStorage, - shouldInvalidateFavoritesCache: true, - ); - return updatedCacheQuote.toDomainModel(); - } - - Future unfavoriteQuote(int id) async { - final updatedCacheQuote = - await remoteApi.unfavoriteQuote(id).toCacheUpdateFuture( - _localStorage, - shouldInvalidateFavoritesCache: true, - ); - return updatedCacheQuote.toDomainModel(); - } - - Future upvoteQuote(int id) async { - final updatedCacheQuote = - await remoteApi.upvoteQuote(id).toCacheUpdateFuture( - _localStorage, - ); - return updatedCacheQuote.toDomainModel(); - } - - Future downvoteQuote(int id) async { - final updatedCacheQuote = - await remoteApi.downvoteQuote(id).toCacheUpdateFuture( - _localStorage, - ); - return updatedCacheQuote.toDomainModel(); - } - - Future unvoteQuote(int id) async { - final updatedCacheQuote = - await remoteApi.unvoteQuote(id).toCacheUpdateFuture( - _localStorage, - ); - return updatedCacheQuote.toDomainModel(); - } - - Future clearCache() async { - await _localStorage.clear(); - } -} - -extension on Future { - Future toCacheUpdateFuture( - QuoteLocalStorage localStorage, { - bool shouldInvalidateFavoritesCache = false, - }) async { - try { - final updatedApiQuote = await this; - final updatedCacheQuote = updatedApiQuote.toCacheModel(); - await Future.wait( - [ - localStorage.updateQuote( - updatedCacheQuote, - !shouldInvalidateFavoritesCache, - ), - if (shouldInvalidateFavoritesCache) - localStorage.clearQuoteListPageList(true), - ], - ); - return updatedCacheQuote; - } catch (error) { - if (error is UserAuthRequiredFavQsException) { - throw UserAuthenticationRequiredException(); - } - rethrow; - } - } -} - -enum QuoteListPageFetchPolicy { - cacheAndNetwork, - networkOnly, - networkPreferably, - cachePreferably, -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/pubspec.yaml deleted file mode 100644 index e01d8c24..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/pubspec.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: quote_repository -publish_to: none - -environment: - sdk: ">=2.13.0 <3.0.0" - -dependencies: - equatable: ^2.0.3 - fav_qs_api: - path: ../fav_qs_api - key_value_storage: - path: ../key_value_storage - domain_models: - path: ../domain_models - -dev_dependencies: - mocktail: 0.1.4 - test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/quote_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/analysis_options.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/analysis_options.yaml deleted file mode 100644 index 19a22f27..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/analysis_options.yaml +++ /dev/null @@ -1,5 +0,0 @@ -include: package:lints/recommended.yaml - -linter: - rules: - - prefer_const_constructors \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/cache_to_domain.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/cache_to_domain.dart deleted file mode 100644 index d989044e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/cache_to_domain.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension DarkModePreferenceCMToDomain on DarkModePreferenceCM { - DarkModePreference toDomainModel() { - switch (this) { - case DarkModePreferenceCM.alwaysDark: - return DarkModePreference.alwaysDark; - case DarkModePreferenceCM.alwaysLight: - return DarkModePreference.alwaysLight; - case DarkModePreferenceCM.accordingToSystemPreferences: - return DarkModePreference.useSystemSettings; - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/domain_to_cache.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/domain_to_cache.dart deleted file mode 100644 index 157928b1..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/domain_to_cache.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:key_value_storage/key_value_storage.dart'; - -extension DarkModePreferenceDomainToCM on DarkModePreference { - DarkModePreferenceCM toCacheModel() { - switch (this) { - case DarkModePreference.alwaysDark: - return DarkModePreferenceCM.alwaysDark; - case DarkModePreference.alwaysLight: - return DarkModePreferenceCM.alwaysLight; - case DarkModePreference.useSystemSettings: - return DarkModePreferenceCM.accordingToSystemPreferences; - } - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/mappers.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/mappers.dart deleted file mode 100644 index a6836bb8..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/mappers.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'cache_to_domain.dart'; -export 'domain_to_cache.dart'; -export 'remote_to_domain.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/remote_to_domain.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/remote_to_domain.dart deleted file mode 100644 index 30e42e34..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/mappers/remote_to_domain.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:fav_qs_api/fav_qs_api.dart'; - -extension UserRMToDomain on UserRM { - User toDomainModel() { - return User( - username: username, - email: email, - ); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_local_storage.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_local_storage.dart deleted file mode 100644 index ef246492..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_local_storage.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:key_value_storage/key_value_storage.dart'; - -class UserLocalStorage { - UserLocalStorage({ - required this.noSqlStorage, - }); - - final KeyValueStorage noSqlStorage; - - Future upsertDarkModePreference(DarkModePreferenceCM preference) async { - final box = await noSqlStorage.darkModePreferenceBox; - await box.put(0, preference); - } - - Future getDarkModePreference() async { - final box = await noSqlStorage.darkModePreferenceBox; - return box.get(0); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_repository.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_repository.dart deleted file mode 100644 index 8562502c..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_repository.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'package:domain_models/domain_models.dart'; -import 'package:fav_qs_api/fav_qs_api.dart'; -import 'package:key_value_storage/key_value_storage.dart'; -import 'package:meta/meta.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:user_repository/src/mappers/mappers.dart'; -import 'package:user_repository/src/user_local_storage.dart'; -import 'package:user_repository/src/user_secure_storage.dart'; - -class UserRepository { - UserRepository({ - required KeyValueStorage noSqlStorage, - required this.remoteApi, - @visibleForTesting UserLocalStorage? localStorage, - @visibleForTesting UserSecureStorage? secureStorage, - }) : _localStorage = localStorage ?? - UserLocalStorage( - noSqlStorage: noSqlStorage, - ), - _secureStorage = secureStorage ?? const UserSecureStorage(); - - final FavQsApi remoteApi; - final UserLocalStorage _localStorage; - final UserSecureStorage _secureStorage; - final BehaviorSubject _userSubject = BehaviorSubject(); - final BehaviorSubject _darkModePreferenceSubject = - BehaviorSubject(); - - Future upsertDarkModePreference(DarkModePreference preference) async { - await _localStorage.upsertDarkModePreference( - preference.toCacheModel(), - ); - _darkModePreferenceSubject.add(preference); - } - - Stream getDarkModePreference() async* { - if (!_darkModePreferenceSubject.hasValue) { - final storedPreference = await _localStorage.getDarkModePreference(); - _darkModePreferenceSubject.add( - storedPreference?.toDomainModel() ?? - DarkModePreference.useSystemSettings, - ); - } - - yield* _darkModePreferenceSubject.stream; - } - - Future signIn(String email, String password) async { - try { - final apiUser = await remoteApi.signIn( - email, - password, - ); - - await _secureStorage.upsertUserInfo( - username: apiUser.username, - email: apiUser.email, - token: apiUser.token, - ); - - final domainUser = apiUser.toDomainModel(); - - _userSubject.add( - domainUser, - ); - } on InvalidCredentialsFavQsException catch (_) { - throw InvalidCredentialsException(); - } - } - - Stream getUser() async* { - if (!_userSubject.hasValue) { - final userInfo = await Future.wait([ - _secureStorage.getUserEmail(), - _secureStorage.getUsername(), - ]); - - final email = userInfo[0]; - final username = userInfo[1]; - - if (email != null && username != null) { - _userSubject.add( - User( - email: email, - username: username, - ), - ); - } else { - _userSubject.add( - null, - ); - } - } - - yield* _userSubject.stream; - } - - Future getUserToken() { - return _secureStorage.getUserToken(); - } - - Future signUp( - String username, - String email, - String password, - ) async { - try { - final userToken = await remoteApi.signUp( - username, - email, - password, - ); - - await _secureStorage.upsertUserInfo( - username: username, - email: email, - token: userToken, - ); - - _userSubject.add( - User( - username: username, - email: email, - ), - ); - } catch (error) { - if (error is UsernameAlreadyTakenFavQsException) { - throw UsernameAlreadyTakenException(); - } else if (error is EmailAlreadyRegisteredFavQsException) { - throw EmailAlreadyRegisteredException(); - } - rethrow; - } - } - - Future updateProfile( - String username, - String email, - String? newPassword, - ) async { - try { - await remoteApi.updateProfile( - username, - email, - newPassword, - ); - - await _secureStorage.upsertUserInfo( - username: username, - email: email, - ); - - _userSubject.add( - User( - username: username, - email: email, - ), - ); - } on UsernameAlreadyTakenFavQsException catch (_) { - throw UsernameAlreadyTakenException(); - } - } - - Future signOut() async { - await remoteApi.signOut(); - await _secureStorage.deleteUserInfo(); - _userSubject.add(null); - } - - Future requestPasswordResetEmail(String email) async { - await remoteApi.requestPasswordResetEmail(email); - } -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_secure_storage.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_secure_storage.dart deleted file mode 100644 index f696a44f..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/src/user_secure_storage.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -class UserSecureStorage { - static const _tokenKey = 'wonder-words-token'; - static const _usernameKey = 'wonder-words-username'; - static const _emailKey = 'wonder-words-email'; - - const UserSecureStorage({ - FlutterSecureStorage? secureStorage, - }) : _secureStorage = secureStorage ?? const FlutterSecureStorage(); - - final FlutterSecureStorage _secureStorage; - - Future upsertUserInfo({ - required String username, - required String email, - String? token, - }) => - Future.wait([ - _secureStorage.write( - key: _emailKey, - value: email, - ), - _secureStorage.write( - key: _usernameKey, - value: username, - ), - if (token != null) - _secureStorage.write( - key: _tokenKey, - value: token, - ) - ]); - - Future deleteUserInfo() => Future.wait([ - _secureStorage.delete( - key: _tokenKey, - ), - _secureStorage.delete( - key: _usernameKey, - ), - _secureStorage.delete( - key: _emailKey, - ), - ]); - - Future getUserToken() => _secureStorage.read( - key: _tokenKey, - ); - - Future getUserEmail() => _secureStorage.read( - key: _emailKey, - ); - - Future getUsername() => _secureStorage.read( - key: _usernameKey, - ); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/user_repository.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/user_repository.dart deleted file mode 100644 index 9e81781e..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/lib/user_repository.dart +++ /dev/null @@ -1 +0,0 @@ -export 'src/user_repository.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/pubspec.yaml deleted file mode 100644 index 3aed0203..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/pubspec.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: user_repository -publish_to: none - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - fav_qs_api: - path: ../fav_qs_api - key_value_storage: - path: ../key_value_storage - domain_models: - path: ../domain_models - rxdart: ^0.27.1 - flutter_secure_storage: ^4.2.0 - -dev_dependencies: - mocktail: 0.1.4 - test: ^1.16.8 - lints: ^1.0.1 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/test/common_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/test/common_test.dart deleted file mode 100644 index ccc2cf56..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/packages/user_repository/test/common_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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:test/test.dart'; - -void main() { - test('Forgot my password', () { - // Build our app and trigger a frame. - expect(1, 1); - }); -} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/propagate-config-files.sh b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/propagate-config-files.sh deleted file mode 100644 index e27a6bf9..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/propagate-config-files.sh +++ /dev/null @@ -1,199 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2021 Razeware LLC -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom -# the Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# Notwithstanding the foregoing, you may not use, copy, modify, -# merge, publish, distribute, sublicense, create a derivative work, -# and/or sell copies of the Software in any work that is designed, -# intended, or marketed for pedagogical or instructional purposes -# related to programming, coding, application development, or -# information technology. Permission for such use, copying, -# modification, merger, publication, distribution, sublicensing, -# creation of derivative works, or sale is expressly withheld. -# -# This project and source code may use libraries or frameworks -# that are released under various Open-Source licenses. Use of -# those libraries and frameworks are governed by their own -# individual licenses. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -DEBUG=false -if [ "$DEBUG" = true ]; then - STD_OUT=/dev/tty -else - STD_OUT=/dev/null -fi - -if [[ "$OSTYPE" == "darwin"* ]]; then - IS_MACOS=true -else - IS_MACOS=false -fi - -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -WANTED_SUBFOLDER_1='.idea' -WANTED_SUBFOLDER_2='.vscode' - -WANTED_SUBFOLDER_3='android/app/src/google-services.json' -WANTED_SUBFOLDER_4='ios/Runner/GoogleService-Info.plist' - -ARR_WANTED=( - "${WANTED_SUBFOLDER_1}" - "${WANTED_SUBFOLDER_2}" - "${WANTED_SUBFOLDER_3}" - "${WANTED_SUBFOLDER_4}" -) - -# Get root directory: /mnt/c/scripts/epidemy/ -ROOT_DIR="$(dirname "$(dirname "$(dirname "$(echo $SCRIPT_DIR)")")")" - -# Double check our core locations aren't empty -[ -z "$ROOT_DIR" ] && echo 'ROOT_DIR variable is unset!' && exit 1 -[ -z "$SCRIPT_DIR" ] && echo 'SCRIPT_DIR variable is unset!' && exit 1 - -# All folders within root (e.g. 01-, 02-, 03-, 04-) -ALL_ROOT=$(find "${ROOT_DIR}" -maxdepth 3 -type d | grep -E '/[0-9]{2}[^/]*/projects/(starter|final|challenge)') - -# Just the folders we care about (not template) -FOLDERS=$(printf "${ALL_ROOT}" | grep -v $(printf ${SCRIPT_DIR})) - -{ - echo - echo ===Found Folders=== - echo '(Template)' $SCRIPT_DIR - echo "${FOLDERS}" - - echo - echo ===Creating Items=== - printf "${FOLDERS}\n" | while read root ; do - - echo $root - - for wanted in "${ARR_WANTED[@]}"; do - orig_item="${SCRIPT_DIR}/${wanted}" - dest_item="${root}/${wanted}" - dest_dir=$(dirname "${dest_item}") - - # Ensure template file exists - if [[ ! -e "${orig_item}" ]]; then - continue - fi - - # Skip item if there isn't a path to copy destination - if [ ! -d "${dest_dir}" ]; then - printf "\tDestination Directory Missing - ${wanted}\n" - continue - fi - - # =============COPY============= # - if [ "$IS_MACOS" = true ]; then - # Doesn't support -T, uses source trailing / - cp -r "${orig_item}" "${dest_item}" - else - # -T to copy entire folder, instead of contents - cp -rT "${orig_item}" "${dest_item}" - fi - printf "\tCreated! - ${wanted}\n" - # =============COPY============= # - - done - echo - done - - echo - echo ===Issues=== - - # Print an error only if we're missing both - ERR_IF_BOTH_1=( - "/src/google-services.json$" - "/Runner/GoogleService-Info.plist$" - ) - BOTH_MISSING_1=true - - # Print an error only if we're missing both - ERR_IF_BOTH_2=( - ".idea$" - ".vscode$" - ) - BOTH_MISSING_2=true - - # Don't perform basic missing check on these items - # Use this if other checks should be used, e.g. ERR_IF_BOTH - # Uses regex to check, note the $ for EOL and the OR symbol - NO_ERR="\/(src|Runner)\/(GoogleService-Info.plist|google-services.json)$" - NO_ERR="${NO_ERR}|\.(vscode|idea)$" - - for wanted in "${ARR_WANTED[@]}"; do - orig_item="${SCRIPT_DIR}/${wanted}" - - # Loop through and check if $wanted matches - for check in "${ERR_IF_BOTH_1[@]}"; do - - # Check current item - echo "${wanted}" | grep -Eq ${check} - - # Current item is in ERR_IF_BOTH_1 - if [ $? -eq 0 ]; then - - # Update flag if item does exist - [ -e "${orig_item}" ] && BOTH_MISSING_1=false - - # End this checker if found a match - [ "$BOTH_MISSING_1" = false ] && break - fi - done - - # Loop through and check if $wanted matches - for check in "${ERR_IF_BOTH_2[@]}"; do - - # Check current item - echo "${wanted}" | grep -Eq ${check} - - # Current item is in ERR_IF_BOTH_2 - if [ $? -eq 0 ]; then - - # Update flag if item does exist - [ -e "${orig_item}" ] && BOTH_MISSING_2=false - - # End this checker if found a match - [ "$BOTH_MISSING_2" = false ] && break - fi - done - - # Don't print missing file error, - # If item path matches NO_ERR pattern - echo ${wanted} | grep -Eq ${NO_ERR} - [ $? -eq 0 ] && continue - - # Generic file missing error - [ ! -e "${orig_item}" ] && echo "${orig_item} Does not exist!" 1>&2 - done - - [ "$BOTH_MISSING_1" = true ] && echo "Your Firebase configuration file(s) couldn’t be found. Please, make sure you have configured at least the dev app for Android or iOS. You won't be able to run the app otherwise." 1>&2 && exit 1 - [ "$BOTH_MISSING_2" = true ] && echo "Your IDE’s custom running configs couldn’t be found. Please, try following the instructions again, or you'll need to run the app from the command line every time by using: flutter run --dart-define=fav-qs-app-token=YOUR_KEY" 1>&2 && exit 1 - -} > $STD_OUT - -echo Done! -exit 0 diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.lock b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.lock deleted file mode 100644 index 0f084c4a..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.lock +++ /dev/null @@ -1,789 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.2" - auto_size_text: - dependency: transitive - description: - name: auto_size_text - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - bloc: - dependency: transitive - description: - name: bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.3" - bloc_concurrency: - dependency: transitive - description: - name: bloc_concurrency - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.15.0" - component_library: - dependency: "direct main" - description: - path: "packages/component_library" - relative: true - source: path - version: "0.0.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - dio: - dependency: transitive - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.4" - domain_models: - dependency: "direct main" - description: - path: "packages/domain_models" - relative: true - source: path - version: "0.0.0" - equatable: - dependency: transitive - description: - name: equatable - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - fav_qs_api: - dependency: "direct main" - description: - path: "packages/fav_qs_api" - relative: true - source: path - version: "0.0.0" - ffi: - dependency: transitive - description: - name: ffi - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - file: - dependency: transitive - description: - name: file - url: "https://pub.dartlang.org" - source: hosted - version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.2" - firebase_analytics: - dependency: transitive - description: - name: firebase_analytics - url: "https://pub.dartlang.org" - source: hosted - version: "8.3.0" - firebase_analytics_platform_interface: - dependency: transitive - description: - name: firebase_analytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - firebase_analytics_web: - dependency: transitive - description: - name: firebase_analytics_web - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.0+1" - firebase_core: - dependency: transitive - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "1.13.1" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.5" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.1" - firebase_crashlytics: - dependency: transitive - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.5.3" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.1" - firebase_dynamic_links: - dependency: transitive - description: - name: firebase_dynamic_links - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - firebase_remote_config: - dependency: transitive - description: - name: firebase_remote_config - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - firebase_remote_config_platform_interface: - dependency: transitive - description: - name: firebase_remote_config_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - firebase_remote_config_web: - dependency: transitive - description: - name: firebase_remote_config_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.7" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: transitive - description: - name: flutter_bloc - url: "https://pub.dartlang.org" - source: hosted - version: "8.0.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: transitive - description: - name: flutter_secure_storage - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.1" - flutter_staggered_grid_view: - dependency: transitive - description: - name: flutter_staggered_grid_view - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - flutter_svg: - dependency: transitive - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.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" - forgot_my_password: - dependency: "direct main" - description: - path: "packages/features/forgot_my_password" - relative: true - source: path - version: "0.0.0" - form_fields: - dependency: transitive - description: - path: "packages/form_fields" - relative: true - source: path - version: "0.0.0" - formz: - dependency: transitive - description: - name: formz - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.1" - hive: - dependency: transitive - description: - name: hive - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.0" - infinite_scroll_pagination: - dependency: transitive - description: - path: "." - ref: develop - resolved-ref: "268945f249caf808173afbf6a567fb615ab24992" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" - intl: - dependency: transitive - description: - name: intl - url: "https://pub.dartlang.org" - source: hosted - version: "0.17.0" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" - json_annotation: - dependency: transitive - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - key_value_storage: - dependency: "direct main" - description: - path: "packages/key_value_storage" - relative: true - source: path - version: "0.0.0" - lints: - dependency: transitive - description: - name: lints - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.11" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.7.0" - mime: - dependency: transitive - description: - name: mime - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - monitoring: - dependency: "direct main" - description: - path: "packages/monitoring" - relative: true - source: path - version: "0.0.0" - nested: - dependency: transitive - description: - name: nested - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0" - path_drawing: - dependency: transitive - description: - name: path_drawing - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive - description: - name: path_parsing - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.1" - path_provider: - dependency: transitive - description: - name: path_provider - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.12" - path_provider_ios: - dependency: transitive - description: - name: path_provider_ios - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - petitparser: - dependency: transitive - description: - name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - platform: - dependency: transitive - description: - name: platform - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - process: - dependency: transitive - description: - name: process - url: "https://pub.dartlang.org" - source: hosted - version: "4.2.4" - profile_menu: - dependency: "direct main" - description: - path: "packages/features/profile_menu" - relative: true - source: path - version: "0.0.0" - provider: - dependency: transitive - description: - name: provider - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.2" - quote_details: - dependency: "direct main" - description: - path: "packages/features/quote_details" - relative: true - source: path - version: "0.0.0" - quote_list: - dependency: "direct main" - description: - path: "packages/features/quote_list" - relative: true - source: path - version: "0.0.0" - quote_repository: - dependency: "direct main" - description: - path: "packages/quote_repository" - relative: true - source: path - version: "0.0.0" - routemaster: - dependency: "direct main" - description: - name: routemaster - url: "https://pub.dartlang.org" - source: hosted - version: "0.9.5" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.3" - share_plus: - dependency: transitive - description: - name: share_plus - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - share_plus_linux: - dependency: transitive - description: - name: share_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - share_plus_macos: - dependency: transitive - description: - name: share_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - share_plus_web: - dependency: transitive - description: - name: share_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.4" - share_plus_windows: - dependency: transitive - description: - name: share_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.3" - sign_in: - dependency: "direct main" - description: - path: "packages/features/sign_in" - relative: true - source: path - version: "0.0.0" - sign_up: - dependency: "direct main" - description: - path: "packages/features/sign_up" - relative: true - source: path - version: "0.0.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - sliver_tools: - dependency: transitive - description: - name: sliver_tools - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.5" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.10.0" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - update_profile: - dependency: "direct main" - description: - path: "packages/features/update_profile" - relative: true - source: path - version: "0.0.0" - url_launcher: - dependency: transitive - description: - name: url_launcher - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.20" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - url: "https://pub.dartlang.org" - source: hosted - version: "6.0.15" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.9" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - user_repository: - dependency: "direct main" - description: - path: "packages/user_repository" - relative: true - source: path - version: "0.0.0" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - win32: - dependency: transitive - description: - name: win32 - url: "https://pub.dartlang.org" - source: hosted - version: "2.4.4" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.0+1" - xml: - dependency: transitive - description: - name: xml - url: "https://pub.dartlang.org" - source: hosted - version: "5.3.1" -sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.10.0" diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.yaml deleted file mode 100644 index cfac12ce..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/pubspec.yaml +++ /dev/null @@ -1,83 +0,0 @@ -name: wonder_words -description: A new Flutter project. - -# The following line prevents the package from being accidentally published to -# pub.dev using `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 used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 - -environment: - sdk: ">=2.14.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - routemaster: ^0.9.5 - key_value_storage: - path: packages/key_value_storage - fav_qs_api: - path: packages/fav_qs_api - quote_repository: - path: packages/quote_repository - user_repository: - path: packages/user_repository - quote_list: - path: packages/features/quote_list - quote_details: - path: packages/features/quote_details - update_profile: - path: packages/features/update_profile - profile_menu: - path: packages/features/profile_menu - sign_in: - path: packages/features/sign_in - forgot_my_password: - path: packages/features/forgot_my_password - sign_up: - path: packages/features/sign_up - domain_models: - path: packages/domain_models - component_library: - path: packages/component_library - monitoring: - path: packages/monitoring - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.2 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^1.0.4 - - -flutter_icons: - android: true - ios: true - remove_alpha_ios: true - image_path: "assets/logos/logo.png" - -# 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. -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 \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/test/widget_test.dart deleted file mode 100644 index a5710976..00000000 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/challange/test/widget_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. 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_test/flutter_test.dart'; - -void main() { - testWidgets('App', (WidgetTester tester) async { - // Build our app and trigger a frame. - expect(1, 1); - }); -} From 071ce516db7d4a0cdcaed21e2946b3759dd7c076 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 00:58:15 +0200 Subject: [PATCH 13/30] Chapter 14 starter project updated --- .../projects/starter/.gitmodules | 4 - .../projects/starter/.metadata | 10 - .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/starter/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 98 ++- .../projects/starter/ios/Runner/Info.plist | 17 +- .../starter/ios/Runner/Runner.entitlements | 10 + .../starter/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../projects/starter/lib/l10n/messages_pt.arb | 4 + .../projects/starter/lib/main.dart | 26 +- .../projects/starter/lib/routing_table.dart | 21 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 ++++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 ++ .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.yaml | 6 +- .../favorite_icon_button_widget_test.dart | 40 +- .../packages/domain_models/pubspec.yaml | 2 +- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../starter/packages/fav_qs_api/pubspec.yaml | 2 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.yaml | 4 +- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 ++ .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.yaml | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 ---- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 4 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 ++ .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 ++- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.yaml | 9 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 ++ .../packages/features/sign_in/pubspec.yaml | 2 +- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../packages/features/sign_up/pubspec.yaml | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../features/update_profile/pubspec.yaml | 4 +- .../starter/packages/form_fields/pubspec.yaml | 2 +- .../packages/key_value_storage/pubspec.yaml | 4 +- .../lib/src/dynamic_link_service.dart | 62 +- .../starter/packages/monitoring/pubspec.yaml | 11 +- .../packages/quote_repository/pubspec.yaml | 4 +- .../packages/user_repository/pubspec.yaml | 6 +- .../projects/starter/pubspec.lock | 153 +++-- .../projects/starter/pubspec.yaml | 8 +- 205 files changed, 5504 insertions(+), 572 deletions(-) delete mode 100644 14-automated-testing/projects/starter/.gitmodules delete mode 100644 14-automated-testing/projects/starter/.metadata create mode 100644 14-automated-testing/projects/starter/ios/Runner/Runner.entitlements create mode 100644 14-automated-testing/projects/starter/lib/l10n/app_localizations_pt.dart create mode 100644 14-automated-testing/projects/starter/lib/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/.metadata create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/README.md create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/analysis_options.yaml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/build.gradle create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/build.gradle create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/gradle.properties create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/android/settings.gradle create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/lib/main.dart create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/lib/stories.dart create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/lib/story_app.dart create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/pubspec.yaml create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/favicon.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/index.html create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/web/manifest.json create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.h create mode 100644 14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 14-automated-testing/projects/starter/packages/features/quote_details/l10n.yaml delete mode 100644 14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) create mode 100644 14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart diff --git a/14-automated-testing/projects/starter/.gitmodules b/14-automated-testing/projects/starter/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/14-automated-testing/projects/starter/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/14-automated-testing/projects/starter/.metadata b/14-automated-testing/projects/starter/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/14-automated-testing/projects/starter/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/14-automated-testing/projects/starter/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/starter/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/14-automated-testing/projects/starter/ios/Flutter/AppFrameworkInfo.plist +++ b/14-automated-testing/projects/starter/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/14-automated-testing/projects/starter/ios/Podfile b/14-automated-testing/projects/starter/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/14-automated-testing/projects/starter/ios/Podfile +++ b/14-automated-testing/projects/starter/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/14-automated-testing/projects/starter/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/starter/ios/Runner.xcodeproj/project.pbxproj index 7d8f5c28..3053d607 100644 --- a/14-automated-testing/projects/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/14-automated-testing/projects/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -30,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -49,10 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -60,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -100,6 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -115,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -143,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -202,6 +193,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -227,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -241,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -277,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -375,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -448,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -523,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/14-automated-testing/projects/starter/ios/Runner/Info.plist b/14-automated-testing/projects/starter/ios/Runner/Info.plist index a6b6b1b6..80173535 100644 --- a/14-automated-testing/projects/starter/ios/Runner/Info.plist +++ b/14-automated-testing/projects/starter/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS @@ -43,7 +58,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/14-automated-testing/projects/starter/ios/Runner/Runner.entitlements b/14-automated-testing/projects/starter/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/14-automated-testing/projects/starter/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/14-automated-testing/projects/starter/lib/l10n/app_localizations.dart b/14-automated-testing/projects/starter/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/14-automated-testing/projects/starter/lib/l10n/app_localizations.dart +++ b/14-automated-testing/projects/starter/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/lib/l10n/app_localizations_en.dart b/14-automated-testing/projects/starter/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/14-automated-testing/projects/starter/lib/l10n/app_localizations_en.dart +++ b/14-automated-testing/projects/starter/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/14-automated-testing/projects/starter/lib/l10n/app_localizations_pt.dart b/14-automated-testing/projects/starter/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/14-automated-testing/projects/starter/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/14-automated-testing/projects/starter/lib/l10n/messages_pt.arb b/14-automated-testing/projects/starter/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/14-automated-testing/projects/starter/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/lib/main.dart b/14-automated-testing/projects/starter/lib/main.dart index 6939b8d7..1daed5a7 100644 --- a/14-automated-testing/projects/starter/lib/main.dart +++ b/14-automated-testing/projects/starter/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -108,19 +108,22 @@ class _WonderWordsState extends State { ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _routerDelegate.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { _routerDelegate.push(path); } @@ -140,12 +143,17 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, @@ -158,6 +166,12 @@ class _WonderWordsState extends State { }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/14-automated-testing/projects/starter/lib/routing_table.dart b/14-automated-testing/projects/starter/lib/routing_table.dart index 4f382a06..20f37847 100644 --- a/14-automated-testing/projects/starter/lib/routing_table.dart +++ b/14-automated-testing/projects/starter/lib/routing_table.dart @@ -92,16 +92,17 @@ Map buildRoutingTable({ onAuthenticationError: () { routerDelegate.push(_PathConstants.signInPath); }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _PathConstants.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, ), ), _PathConstants.signInPath: (_) => MaterialPage( diff --git a/14-automated-testing/projects/starter/packages/component_library/assets/closing-quote.svg b/14-automated-testing/projects/starter/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/14-automated-testing/projects/starter/packages/component_library/assets/closing-quote.svg +++ b/14-automated-testing/projects/starter/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/assets/opening-quote.svg b/14-automated-testing/projects/starter/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/14-automated-testing/projects/starter/packages/component_library/assets/opening-quote.svg +++ b/14-automated-testing/projects/starter/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/14-automated-testing/projects/starter/packages/component_library/example/.metadata b/14-automated-testing/projects/starter/packages/component_library/example/.metadata new file mode 100644 index 00000000..e27f5ccf --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/.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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/14-automated-testing/projects/starter/packages/component_library/example/README.md b/14-automated-testing/projects/starter/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/14-automated-testing/projects/starter/packages/component_library/example/analysis_options.yaml b/14-automated-testing/projects/starter/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/android/app/build.gradle b/14-automated-testing/projects/starter/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/build.gradle b/14-automated-testing/projects/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/gradle.properties b/14-automated-testing/projects/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/14-automated-testing/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/14-automated-testing/projects/starter/packages/component_library/example/android/settings.gradle b/14-automated-testing/projects/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/assets/animations/loader.json b/14-automated-testing/projects/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/14-automated-testing/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Info.plist b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/lib/component_storybook.dart b/14-automated-testing/projects/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/lib/main.dart b/14-automated-testing/projects/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/lib/stories.dart b/14-automated-testing/projects/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/lib/story_app.dart b/14-automated-testing/projects/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/linux/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/14-automated-testing/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/14-automated-testing/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/starter/packages/component_library/example/linux/main.cc b/14-automated-testing/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.cc b/14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.h b/14-automated-testing/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/pubspec.yaml b/14-automated-testing/projects/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/example/web/favicon.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-192.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-512.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/web/index.html b/14-automated-testing/projects/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/web/manifest.json b/14-automated-testing/projects/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/14-automated-testing/projects/starter/packages/component_library/example/windows/.gitignore b/14-automated-testing/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/14-automated-testing/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/main.cpp b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/resource.h b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.h b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/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/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/exception_indicator.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/14-automated-testing/projects/starter/packages/component_library/lib/src/exception_indicator.dart +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/quote_card.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/14-automated-testing/projects/starter/packages/component_library/lib/src/quote_card.dart +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/14-automated-testing/projects/starter/packages/component_library/lib/src/search_bar.dart b/14-automated-testing/projects/starter/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/14-automated-testing/projects/starter/packages/component_library/lib/src/search_bar.dart +++ b/14-automated-testing/projects/starter/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/14-automated-testing/projects/starter/packages/component_library/pubspec.yaml b/14-automated-testing/projects/starter/packages/component_library/pubspec.yaml index 2575ccb5..d75f7082 100644 --- a/14-automated-testing/projects/starter/packages/component_library/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/component_library/pubspec.yaml @@ -10,15 +10,15 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0 - flutter_svg: ^1.1.1+1 + flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index 0ef5c6e9..b27b6a3f 100644 --- a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -4,7 +4,43 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - // TODO: add implementation of widgetTest + group('FavoriteIconButton tests: ', () { + //Challange + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); - // Challenge + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + + testWidgets('onTap() callback is executed when tapping on button', + (tester) async { + bool value = false; + + await tester.pumpWidget(MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + onTap: () { + value = !value; + }), + ), + )); + + await tester.tap(find.byType(FavoriteIconButton)); + + expect(value, true); + }); + }); } diff --git a/14-automated-testing/projects/starter/packages/domain_models/pubspec.yaml b/14-automated-testing/projects/starter/packages/domain_models/pubspec.yaml index d50211d8..b09f3aa3 100644 --- a/14-automated-testing/projects/starter/packages/domain_models/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/domain_models/pubspec.yaml @@ -8,5 +8,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart b/14-automated-testing/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/14-automated-testing/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/14-automated-testing/projects/starter/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/14-automated-testing/projects/starter/packages/fav_qs_api/pubspec.yaml b/14-automated-testing/projects/starter/packages/fav_qs_api/pubspec.yaml index 9a9b9ffe..3e95a442 100644 --- a/14-automated-testing/projects/starter/packages/fav_qs_api/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/fav_qs_api/pubspec.yaml @@ -15,4 +15,4 @@ dev_dependencies: build_runner: ^2.0.5 json_serializable: ^6.2.0 test: ^1.21.2 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 diff --git a/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/forgot_my_password/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/forgot_my_password/pubspec.yaml index 5395f45c..fc6d79ab 100644 --- a/14-automated-testing/projects/starter/packages/features/forgot_my_password/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/forgot_my_password/pubspec.yaml @@ -18,9 +18,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/14-automated-testing/projects/starter/packages/features/profile_menu/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/profile_menu/pubspec.yaml index 95eb1f48..8f33a7c1 100644 --- a/14-automated-testing/projects/starter/packages/features/profile_menu/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/profile_menu/pubspec.yaml @@ -24,9 +24,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/l10n.yaml b/14-automated-testing/projects/starter/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/14-automated-testing/projects/starter/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/lib/quote_details.dart b/14-automated-testing/projects/starter/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_details/lib/quote_details.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart b/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/14-automated-testing/projects/starter/packages/features/quote_details/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/quote_details/pubspec.yaml index cf7a6214..5f16c003 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_details/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/quote_details/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/14-automated-testing/projects/starter/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/14-automated-testing/projects/starter/packages/features/quote_list/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/quote_list/pubspec.yaml index 9ee3767d..7eef55f0 100644 --- a/14-automated-testing/projects/starter/packages/features/quote_list/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/quote_list/pubspec.yaml @@ -20,18 +20,15 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/starter/packages/features/sign_in/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/sign_in/pubspec.yaml index 0464dbe4..9f15389f 100644 --- a/14-automated-testing/projects/starter/packages/features/sign_in/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/sign_in/pubspec.yaml @@ -23,7 +23,7 @@ dev_dependencies: bloc_test: ^9.0.3 mockito: ^5.2.0 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/starter/packages/features/sign_up/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/sign_up/pubspec.yaml index 64c8a099..bf170f01 100644 --- a/14-automated-testing/projects/starter/packages/features/sign_up/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/sign_up/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/starter/packages/features/update_profile/pubspec.yaml b/14-automated-testing/projects/starter/packages/features/update_profile/pubspec.yaml index 18afb6ab..11b78caf 100644 --- a/14-automated-testing/projects/starter/packages/features/update_profile/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/features/update_profile/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/starter/packages/form_fields/pubspec.yaml b/14-automated-testing/projects/starter/packages/form_fields/pubspec.yaml index 2c530e1d..feed53bc 100644 --- a/14-automated-testing/projects/starter/packages/form_fields/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/form_fields/pubspec.yaml @@ -9,5 +9,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/key_value_storage/pubspec.yaml b/14-automated-testing/projects/starter/packages/key_value_storage/pubspec.yaml index a2e8301e..bca9f9c8 100644 --- a/14-automated-testing/projects/starter/packages/key_value_storage/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/key_value_storage/pubspec.yaml @@ -5,11 +5,11 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - hive: ^2.2.3 + hive: 2.0.4 path_provider: ^2.0.2 dev_dependencies: build_runner: ^2.0.5 hive_generator: ^1.1.0 - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart b/14-automated-testing/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/14-automated-testing/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/14-automated-testing/projects/starter/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/14-automated-testing/projects/starter/packages/monitoring/pubspec.yaml b/14-automated-testing/projects/starter/packages/monitoring/pubspec.yaml index 74362f59..9ee1fb00 100644 --- a/14-automated-testing/projects/starter/packages/monitoring/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/monitoring/pubspec.yaml @@ -7,13 +7,12 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 firebase_analytics: ^9.1.12 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 + firebase_remote_config: ^2.0.11 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/quote_repository/pubspec.yaml b/14-automated-testing/projects/starter/packages/quote_repository/pubspec.yaml index e4328325..e01d8c24 100644 --- a/14-automated-testing/projects/starter/packages/quote_repository/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/quote_repository/pubspec.yaml @@ -14,6 +14,6 @@ dependencies: path: ../domain_models dev_dependencies: - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 \ No newline at end of file diff --git a/14-automated-testing/projects/starter/packages/user_repository/pubspec.yaml b/14-automated-testing/projects/starter/packages/user_repository/pubspec.yaml index 768ea04e..d3dcdcac 100644 --- a/14-automated-testing/projects/starter/packages/user_repository/pubspec.yaml +++ b/14-automated-testing/projects/starter/packages/user_repository/pubspec.yaml @@ -12,10 +12,10 @@ dependencies: domain_models: path: ../domain_models rxdart: ^0.27.1 - flutter_secure_storage: ^5.0.2 + flutter_secure_storage: ^4.2.0 dev_dependencies: # TODO: add mockito library test: ^1.16.8 - lints: ^2.0.0 - build_runner: ^2.0.5 \ No newline at end of file + lints: ^1.0.1 + build_runner: ^2.0.5 diff --git a/14-automated-testing/projects/starter/pubspec.lock b/14-automated-testing/projects/starter/pubspec.lock index 2407e5e5..803bac5d 100644 --- a/14-automated-testing/projects/starter/pubspec.lock +++ b/14-automated-testing/projects/starter/pubspec.lock @@ -1,13 +1,20 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -42,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -56,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -77,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -112,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -134,97 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.3" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.4" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.17.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.6" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.12" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -237,13 +244,18 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "1.0.4" flutter_localizations: dependency: "direct main" description: flutter @@ -262,14 +274,14 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "1.1.1+1" + version: "0.22.0" flutter_test: dependency: "direct dev" description: flutter @@ -301,6 +313,11 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.1" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" hive: dependency: transitive description: @@ -308,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -325,12 +335,15 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "1a7291cc7d1705f42482d450ecf1f2889ec75ce6" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -365,28 +378,28 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.0.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -408,34 +421,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.5.1+1" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.2.1" path_provider: dependency: transitive description: @@ -491,7 +497,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -636,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -664,28 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + sync_http: + dependency: transitive + description: + name: sync_http + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -763,6 +776,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.0.0" + webdriver: + dependency: transitive + description: + name: webdriver + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" win32: dependency: transitive description: @@ -783,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "5.3.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.11.0-0.1.pre" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/14-automated-testing/projects/starter/pubspec.yaml b/14-automated-testing/projects/starter/pubspec.yaml index b41c1f2b..aa052b06 100644 --- a/14-automated-testing/projects/starter/pubspec.yaml +++ b/14-automated-testing/projects/starter/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. # The following line prevents the package from being accidentally published to # pub.dev using `pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +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 @@ -63,8 +63,7 @@ dev_dependencies: # TODO: add missing package flutter_test: sdk: flutter - flutter_lints: ^2.0.1 - + flutter_lints: ^1.0.4 flutter_icons: android: true @@ -77,8 +76,7 @@ flutter_icons: # The following section is specific to Flutter. 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 \ No newline at end of file + uses-material-design: true From 5f718cba65c687daf5a16838d8fd1094ca38771d Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:03:36 +0200 Subject: [PATCH 14/30] Chapter 14 challenge updated --- .../projects/challenge/.gitmodules | 4 - .../projects/challenge/.metadata | 10 - .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../projects/challenge/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 98 ++- .../projects/challenge/ios/Runner/Info.plist | 17 +- .../challenge/ios/Runner/Runner.entitlements | 10 + .../challenge/lib/l10n/app_localizations.dart | 22 +- .../lib/l10n/app_localizations_en.dart | 3 - .../lib/l10n/app_localizations_pt.dart | 12 + .../challenge/lib/l10n/messages_pt.arb | 4 + .../projects/challenge/lib/main.dart | 26 +- .../projects/challenge/lib/routing_table.dart | 21 +- .../assets/closing-quote.svg | 12 +- .../assets/opening-quote.svg | 20 +- .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 41 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 29 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 33 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 47 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../example/test/widget_test.dart | 30 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 101 ++++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ .../lib/src/exception_indicator.dart | 1 - .../l10n/component_library_localizations.dart | 18 +- .../component_library_localizations_en.dart | 2 +- .../component_library_localizations_pt.dart | 42 ++ .../lib/src/l10n/messages_pt.arb | 13 + .../component_library/lib/src/quote_card.dart | 1 - .../component_library/lib/src/search_bar.dart | 1 - .../packages/component_library/pubspec.yaml | 6 +- .../favorite_icon_button_widget_test.dart | 31 +- .../packages/domain_models/pubspec.yaml | 2 +- .../fav_qs_api/lib/src/fav_qs_api.dart | 4 - .../packages/fav_qs_api/pubspec.yaml | 2 +- .../forgot_my_password_localizations.dart | 16 +- .../forgot_my_password_localizations_pt.dart | 32 + .../lib/src/l10n/messages_pt.arb | 10 + .../features/forgot_my_password/pubspec.yaml | 4 +- .../lib/src/dark_mode_preference_picker.dart | 7 +- .../profile_menu/lib/src/l10n/messages_pt.arb | 19 + .../src/l10n/profile_menu_localizations.dart | 10 +- .../l10n/profile_menu_localizations_pt.dart | 40 ++ .../lib/src/profile_menu_screen.dart | 4 +- .../features/profile_menu/pubspec.yaml | 4 +- .../packages/features/quote_details/l10n.yaml | 6 - .../quote_details/lib/quote_details.dart | 1 - .../lib/src/l10n/messages_en.arb | 10 - .../src/l10n/quote_details_localizations.dart | 133 ---- .../l10n/quote_details_localizations_en.dart | 11 - .../lib/src/quote_details_screen.dart | 31 +- .../features/quote_details/pubspec.yaml | 4 +- .../lib/src/filter_horizontal_list.dart | 3 +- .../quote_list/lib/src/l10n/messages_en.arb | 1 + .../quote_list/lib/src/l10n/messages_pt.arb | 11 + .../src/l10n/quote_list_localizations.dart | 53 +- .../src/l10n/quote_list_localizations_en.dart | 9 +- .../src/l10n/quote_list_localizations_pt.dart | 36 ++ .../quote_list/lib/src/quote_list_bloc.dart | 5 +- .../quote_list/lib/src/quote_list_screen.dart | 74 ++- ...r_grid.dart => quote_paged_grid_view.dart} | 11 +- ...r_list.dart => quote_paged_list_view.dart} | 8 +- .../packages/features/quote_list/pubspec.yaml | 9 +- .../sign_in/lib/src/l10n/messages_pt.arb | 14 + .../lib/src/l10n/sign_in_localizations.dart | 16 +- .../src/l10n/sign_in_localizations_pt.dart | 44 ++ .../packages/features/sign_in/pubspec.yaml | 2 +- .../sign_in/test/sign_in_cubit_test.dart | 4 +- .../sign_up/lib/src/l10n/messages_pt.arb | 19 + .../lib/src/l10n/sign_up_localizations.dart | 16 +- .../src/l10n/sign_up_localizations_pt.dart | 65 ++ .../packages/features/sign_up/pubspec.yaml | 4 +- .../lib/src/l10n/messages_pt.arb | 16 + .../l10n/update_profile_localizations.dart | 20 +- .../l10n/update_profile_localizations_en.dart | 4 +- .../l10n/update_profile_localizations_pt.dart | 54 ++ .../features/update_profile/pubspec.yaml | 4 +- .../packages/form_fields/pubspec.yaml | 2 +- .../packages/key_value_storage/pubspec.yaml | 4 +- .../lib/src/dynamic_link_service.dart | 62 +- .../packages/monitoring/pubspec.yaml | 11 +- .../packages/quote_repository/pubspec.yaml | 4 +- .../packages/user_repository/pubspec.yaml | 4 +- .../projects/challenge/pubspec.lock | 116 ++-- .../projects/challenge/pubspec.yaml | 2 +- 207 files changed, 5471 insertions(+), 585 deletions(-) delete mode 100644 14-automated-testing/projects/challenge/.gitmodules delete mode 100644 14-automated-testing/projects/challenge/.metadata create mode 100644 14-automated-testing/projects/challenge/ios/Runner/Runner.entitlements create mode 100644 14-automated-testing/projects/challenge/lib/l10n/app_localizations_pt.dart create mode 100644 14-automated-testing/projects/challenge/lib/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/.metadata create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/README.md create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/analysis_options.yaml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/build.gradle create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/build.gradle create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/gradle.properties create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/android/settings.gradle create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/loader.json create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Info.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/lib/component_storybook.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/lib/main.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/lib/stories.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/lib/story_app.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/CMakeLists.txt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/main.cc create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.cc create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Info.plist create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/pubspec.yaml create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/favicon.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-192.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-512.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/index.html create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/web/manifest.json create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/.gitignore create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/CMakeLists.txt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/Runner.rc create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/main.cpp create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/resource.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.cpp create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.h create mode 100644 14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart create mode 100644 14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart create mode 100644 14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart delete mode 100644 14-automated-testing/projects/challenge/packages/features/quote_details/l10n.yaml delete mode 100644 14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb delete mode 100644 14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart delete mode 100644 14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart create mode 100644 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart rename 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/{quote_sliver_grid.dart => quote_paged_grid_view.dart} (92%) rename 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/{quote_sliver_list.dart => quote_paged_list_view.dart} (94%) create mode 100644 14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart create mode 100644 14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart create mode 100644 14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb create mode 100644 14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart diff --git a/14-automated-testing/projects/challenge/.gitmodules b/14-automated-testing/projects/challenge/.gitmodules deleted file mode 100644 index ee9d7761..00000000 --- a/14-automated-testing/projects/challenge/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule ".flutter"] - path = .flutter - url = https://github.com/flutter/flutter.git - branch = stable diff --git a/14-automated-testing/projects/challenge/.metadata b/14-automated-testing/projects/challenge/.metadata deleted file mode 100644 index 56bfc2c4..00000000 --- a/14-automated-testing/projects/challenge/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: app diff --git a/14-automated-testing/projects/challenge/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/challenge/ios/Flutter/AppFrameworkInfo.plist index 8d4492f9..9625e105 100644 --- a/14-automated-testing/projects/challenge/ios/Flutter/AppFrameworkInfo.plist +++ b/14-automated-testing/projects/challenge/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/14-automated-testing/projects/challenge/ios/Podfile b/14-automated-testing/projects/challenge/ios/Podfile index 1e8c3c90..85198f16 100644 --- a/14-automated-testing/projects/challenge/ios/Podfile +++ b/14-automated-testing/projects/challenge/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/14-automated-testing/projects/challenge/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/challenge/ios/Runner.xcodeproj/project.pbxproj index 7d8f5c28..3053d607 100644 --- a/14-automated-testing/projects/challenge/ios/Runner.xcodeproj/project.pbxproj +++ b/14-automated-testing/projects/challenge/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 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 */; }; + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -30,18 +31,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 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 = ""; }; - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.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; }; @@ -49,10 +47,8 @@ 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 = ""; }; - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -60,13 +56,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 365E3FE8C959E50B21F73909 /* Pods_Runner.framework in Frameworks */, + 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 772A70B30FBD21C39A96DD10 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -85,7 +89,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, - F75AC01FDF82856FC96460E3 /* Frameworks */, + 772A70B30FBD21C39A96DD10 /* Frameworks */, ); sourceTree = ""; }; @@ -100,6 +104,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + FB358A9727748EA50060F3F1 /* GoogleService-Info.plist */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -115,27 +120,13 @@ A231D06941EC426CD09FC4D3 /* Pods */ = { isa = PBXGroup; children = ( - DAD1BFE885D0B7A8B4CFDE40 /* Pods-Runner.debug.xcconfig */, - 0503D2C2ECDFED8452F44B2B /* Pods-Runner.release.xcconfig */, - FC34A53D468354B037ECC5E5 /* Pods-Runner.profile.xcconfig */, - 250FBCD80C33260FBDEDBA8D /* Pods-Runner.debug-prod.xcconfig */, - 871F8549777C9D61FE7A2226 /* Pods-Runner.debug-dev.xcconfig */, - 62FE6140869EF4C6FCE7A43A /* Pods-Runner.release-prod.xcconfig */, - 0AFE8081B107CAB9D55FF4FD /* Pods-Runner.release-dev.xcconfig */, - 9936AD8B85DE93EAA4CDA5C4 /* Pods-Runner.profile-prod.xcconfig */, - 873115C5249A35327659BCBC /* Pods-Runner.profile-dev.xcconfig */, + 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */, + 15B5C6E6249AE001AD6011D2 /* Pods-Runner.release.xcconfig */, + 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; - F75AC01FDF82856FC96460E3 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E465E1D0AF5F1FB61AF86BF3 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -143,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */, + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */, 18D5ABA327EF75FA008E4DC0 /* ShellScript */, + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -202,6 +193,7 @@ files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + FB358A9827748EA50060F3F1 /* GoogleService-Info.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); @@ -227,6 +219,23 @@ shellPath = /bin/sh; shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; }; + 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -241,7 +250,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6AD3D50B5D08EA41896BF25E /* [CP] Check Pods Manifest.lock */ = { + 54960D562E28735CC863FB81 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -277,23 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - E46F7587ABC731E167B6B67C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -375,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -448,7 +440,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -523,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/14-automated-testing/projects/challenge/ios/Runner/Info.plist b/14-automated-testing/projects/challenge/ios/Runner/Info.plist index a6b6b1b6..80173535 100644 --- a/14-automated-testing/projects/challenge/ios/Runner/Info.plist +++ b/14-automated-testing/projects/challenge/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -20,6 +22,19 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + Bundle ID + CFBundleURLSchemes + + com.raywenderlich.wonderWords + + + CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS @@ -43,7 +58,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - diff --git a/14-automated-testing/projects/challenge/ios/Runner/Runner.entitlements b/14-automated-testing/projects/challenge/ios/Runner/Runner.entitlements new file mode 100644 index 00000000..39cbc95c --- /dev/null +++ b/14-automated-testing/projects/challenge/ios/Runner/Runner.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:wonderwords1.page.link + + + diff --git a/14-automated-testing/projects/challenge/lib/l10n/app_localizations.dart b/14-automated-testing/projects/challenge/lib/l10n/app_localizations.dart index 393bd5c2..e47fb9f9 100644 --- a/14-automated-testing/projects/challenge/lib/l10n/app_localizations.dart +++ b/14-automated-testing/projects/challenge/lib/l10n/app_localizations.dart @@ -1,4 +1,3 @@ - import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -7,15 +6,16 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'app_localizations_en.dart'; +import 'app_localizations_pt.dart'; -/// Callers can lookup localized strings with an instance of AppLocalizations returned -/// by `AppLocalizations.of(context)`. +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. /// /// Applications need to include `AppLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: /// -/// ``` +/// ```dart /// import 'l10n/app_localizations.dart'; /// /// return MaterialApp( @@ -30,14 +30,14 @@ import 'app_localizations_en.dart'; /// Please make sure to update your pubspec.yaml to include the following /// packages: /// -/// ``` +/// ```yaml /// dependencies: /// # Internationalization support. /// flutter_localizations: /// sdk: flutter /// intl: any # Use the pinned version from flutter_localizations /// -/// # rest of dependencies +/// # Rest of dependencies /// ``` /// /// ## iOS Applications @@ -89,7 +89,8 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ - Locale('en') + Locale('en'), + Locale('pt') ]; /// No description provided for @quotesBottomNavigationBarItemLabel. @@ -114,7 +115,7 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate } @override - bool isSupported(Locale locale) => ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -126,6 +127,7 @@ AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return AppLocalizationsEn(); + case 'pt': return AppLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/lib/l10n/app_localizations_en.dart b/14-automated-testing/projects/challenge/lib/l10n/app_localizations_en.dart index 0f76c873..33a3ea93 100644 --- a/14-automated-testing/projects/challenge/lib/l10n/app_localizations_en.dart +++ b/14-automated-testing/projects/challenge/lib/l10n/app_localizations_en.dart @@ -1,6 +1,3 @@ - - - import 'app_localizations.dart'; /// The translations for English (`en`). diff --git a/14-automated-testing/projects/challenge/lib/l10n/app_localizations_pt.dart b/14-automated-testing/projects/challenge/lib/l10n/app_localizations_pt.dart new file mode 100644 index 00000000..858f588d --- /dev/null +++ b/14-automated-testing/projects/challenge/lib/l10n/app_localizations_pt.dart @@ -0,0 +1,12 @@ +import 'app_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class AppLocalizationsPt extends AppLocalizations { + AppLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quotesBottomNavigationBarItemLabel => 'Frases'; + + @override + String get profileBottomNavigationBarItemLabel => 'Perfil'; +} diff --git a/14-automated-testing/projects/challenge/lib/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/lib/l10n/messages_pt.arb new file mode 100644 index 00000000..910c91a5 --- /dev/null +++ b/14-automated-testing/projects/challenge/lib/l10n/messages_pt.arb @@ -0,0 +1,4 @@ +{ + "quotesBottomNavigationBarItemLabel": "Frases", + "profileBottomNavigationBarItemLabel": "Perfil" +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/lib/main.dart b/14-automated-testing/projects/challenge/lib/main.dart index 6939b8d7..1daed5a7 100644 --- a/14-automated-testing/projects/challenge/lib/main.dart +++ b/14-automated-testing/projects/challenge/lib/main.dart @@ -5,11 +5,11 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:fav_qs_api/fav_qs_api.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:forgot_my_password/forgot_my_password.dart'; import 'package:key_value_storage/key_value_storage.dart'; import 'package:monitoring/monitoring.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:routemaster/routemaster.dart'; @@ -108,19 +108,22 @@ class _WonderWordsState extends State { ); final _lightTheme = LightWonderThemeData(); final _darkTheme = DarkWonderThemeData(); + late StreamSubscription _incomingDynamicLinksSubscription; @override void initState() { super.initState(); + _openInitialDynamicLinkIfAny(); - _dynamicLinkService.setListener( - (String path) => _routerDelegate.push, - ); + _incomingDynamicLinksSubscription = + _dynamicLinkService.onNewDynamicLinkPath().listen( + _routerDelegate.push, + ); } Future _openInitialDynamicLinkIfAny() async { - final path = await _dynamicLinkService.getInitialDeepLinkPath(); + final path = await _dynamicLinkService.getInitialDynamicLinkPath(); if (path != null) { _routerDelegate.push(path); } @@ -140,12 +143,17 @@ class _WonderWordsState extends State { theme: _lightTheme.materialThemeData, darkTheme: _darkTheme.materialThemeData, themeMode: darkModePreference?.toThemeMode(), + supportedLocales: const [ + Locale('en', ''), + Locale('pt', 'BR'), + ], localizationsDelegates: const [ + GlobalCupertinoLocalizations.delegate, + GlobalMaterialLocalizations.delegate, AppLocalizations.delegate, ComponentLibraryLocalizations.delegate, ProfileMenuLocalizations.delegate, QuoteListLocalizations.delegate, - QuoteDetailsLocalizations.delegate, SignInLocalizations.delegate, ForgotMyPasswordLocalizations.delegate, SignUpLocalizations.delegate, @@ -158,6 +166,12 @@ class _WonderWordsState extends State { }, ); } + + @override + void dispose() { + _incomingDynamicLinksSubscription.cancel(); + super.dispose(); + } } extension on DarkModePreference { diff --git a/14-automated-testing/projects/challenge/lib/routing_table.dart b/14-automated-testing/projects/challenge/lib/routing_table.dart index 4f382a06..20f37847 100644 --- a/14-automated-testing/projects/challenge/lib/routing_table.dart +++ b/14-automated-testing/projects/challenge/lib/routing_table.dart @@ -92,16 +92,17 @@ Map buildRoutingTable({ onAuthenticationError: () { routerDelegate.push(_PathConstants.signInPath); }, - shareableLinkGenerator: (quote) => - dynamicLinkService.generateDynamicLinkUrl( - path: _PathConstants.quoteDetailsPath( - quoteId: quote.id, - ), - socialMetaTagParameters: SocialMetaTagParameters( - title: quote.body, - description: quote.author, - ), - ), + shareableLinkGenerator: (quote) { + return dynamicLinkService.generateDynamicLinkUrl( + path: _PathConstants.quoteDetailsPath( + quoteId: quote.id, + ), + socialMetaTagParameters: SocialMetaTagParameters( + title: quote.body, + description: quote.author, + ), + ); + }, ), ), _PathConstants.signInPath: (_) => MaterialPage( diff --git a/14-automated-testing/projects/challenge/packages/component_library/assets/closing-quote.svg b/14-automated-testing/projects/challenge/packages/component_library/assets/closing-quote.svg index 3fc052ab..dabb2389 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/assets/closing-quote.svg +++ b/14-automated-testing/projects/challenge/packages/component_library/assets/closing-quote.svg @@ -1,11 +1 @@ - - - - ic_fluent_text_quote_24_regular - Created with Sketch. - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/assets/opening-quote.svg b/14-automated-testing/projects/challenge/packages/component_library/assets/opening-quote.svg index 22973965..c32e06de 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/assets/opening-quote.svg +++ b/14-automated-testing/projects/challenge/packages/component_library/assets/opening-quote.svg @@ -1,19 +1 @@ - - - - -Created with Sketch. - - - - - - + \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/.gitignore new file mode 100644 index 00000000..0fa6b675 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# 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/14-automated-testing/projects/challenge/packages/component_library/example/.metadata b/14-automated-testing/projects/challenge/packages/component_library/example/.metadata new file mode 100644 index 00000000..e27f5ccf --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/.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: e3c29ec00c9c825c891d75054c63fcc46454dca1 + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: android + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: ios + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: linux + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: macos + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: web + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + - platform: windows + create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 + + # 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/14-automated-testing/projects/challenge/packages/component_library/example/README.md b/14-automated-testing/projects/challenge/packages/component_library/example/README.md new file mode 100644 index 00000000..a1356260 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/analysis_options.yaml b/14-automated-testing/projects/challenge/packages/component_library/example/analysis_options.yaml new file mode 100644 index 00000000..a3be6b82 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/analysis_options.yaml @@ -0,0 +1 @@ +include: package:flutter_lints/flutter.yaml \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/android/app/build.gradle b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/build.gradle new file mode 100644 index 00000000..56bfa9b7 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/build.gradle @@ -0,0 +1,68 @@ +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' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + 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" +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..34dd77ef --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 00000000..e793a000 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..449a9f93 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values/styles.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..d74aa35c --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c208884f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/build.gradle b/14-automated-testing/projects/challenge/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..ed45c658 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle.properties b/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bc6a58af --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/android/settings.gradle b/14-automated-testing/projects/challenge/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/loader.json b/14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/on_off_switch.riv b/14-automated-testing/projects/challenge/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..151026b9 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Debug.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Release.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..30b65244 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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_OPTIMIZATION_LEVEL = "-Owholemodule"; + 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.example; + 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.example; + 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 */ + 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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..3db53b6e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/AppDelegate.swift b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Info.plist b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..1579fb30 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/lib/component_storybook.dart b/14-automated-testing/projects/challenge/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/lib/main.dart b/14-automated-testing/projects/challenge/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/lib/stories.dart b/14-automated-testing/projects/challenge/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/lib/story_app.dart b/14-automated-testing/projects/challenge/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/linux/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/linux/CMakeLists.txt b/14-automated-testing/projects/challenge/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/challenge/packages/component_library/example/linux/main.cc b/14-automated-testing/projects/challenge/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.cc b/14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.h b/14-automated-testing/projects/challenge/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jR^;j87-Auq zoUlN^K{r-Q+XN;zI ze|?*NFmgt#V#GwrSWaz^2G&@SBmck6ZcIFMww~vE<1E?M2#KUn1CzsB6D2+0SuRV@ zV2kK5HvIGB{HX-hQzs0*AB%5$9RJ@a;)Ahq#p$GSP91^&hi#6sg*;a~dt}4AclK>h z_3MoPRQ{i;==;*1S-mY<(JFzhAxMI&<61&m$J0NDHdJ3tYx~j0%M-uN6Zl8~_0DOkGXc0001@sz3l12C6Xg{AT~( zm6w64BA|AX`Ve)YY-glyudNN>MAfkXz-T7`_`fEolM;0T0BA)(02-OaW z0*cW7Z~ec94o8&g0D$N>b!COu{=m}^%oXZ4?T8ZyPZuGGBPBA7pbQMoV5HYhiT?%! zcae~`(QAN4&}-=#2f5fkn!SWGWmSeCISBcS=1-U|MEoKq=k?_x3apK>9((R zuu$9X?^8?@(a{qMS%J8SJPq))v}Q-ZyDm6Gbie0m92=`YlwnQPQP1kGSm(N2UJ3P6 z^{p-u)SSCTW~c1rw;cM)-uL2{->wCn2{#%;AtCQ!m%AakVs1K#v@(*-6QavyY&v&*wO_rCJXJuq$c$7ZjsW+pJo-$L^@!7X04CvaOpPyfw|FKvu;e(&Iw>Tbg zL}#8e^?X%TReXTt>gsBByt0kSU20oQx*~P=4`&tcZ7N6t-6LiK{LxX*p6}9c<0Pu^ zLx1w_P4P2V>bX=`F%v$#{sUDdF|;rbI{p#ZW`00Bgh(eB(nOIhy8W9T>3aQ=k8Z9% zB+TusFABF~J?N~fAd}1Rme=@4+1=M{^P`~se7}e3;mY0!%#MJf!XSrUC{0uZqMAd7%q zQY#$A>q}noIB4g54Ue)x>ofVm3DKBbUmS4Z-bm7KdKsUixva)1*&z5rgAG2gxG+_x zqT-KNY4g7eM!?>==;uD9Y4iI(Hu$pl8!LrK_Zb}5nv(XKW{9R144E!cFf36p{i|8pRL~p`_^iNo z{mf7y`#hejw#^#7oKPlN_Td{psNpNnM?{7{R-ICBtYxk>?3}OTH_8WkfaTLw)ZRTfxjW+0>gMe zpKg~`Bc$Y>^VX;ks^J0oKhB#6Ukt{oQhN+o2FKGZx}~j`cQB%vVsMFnm~R_1Y&Ml? zwFfb~d|dW~UktY@?zkau>Owe zRroi(<)c4Ux&wJfY=3I=vg)uh;sL(IYY9r$WK1$F;jYqq1>xT{LCkIMb3t2jN8d`9 z=4(v-z7vHucc_fjkpS}mGC{ND+J-hc_0Ix4kT^~{-2n|;Jmn|Xf9wGudDk7bi*?^+ z7fku8z*mbkGm&xf&lmu#=b5mp{X(AwtLTf!N`7FmOmX=4xwbD=fEo8CaB1d1=$|)+ z+Dlf^GzGOdlqTO8EwO?8;r+b;gkaF^$;+#~2_YYVH!hD6r;PaWdm#V=BJ1gH9ZK_9 zrAiIC-)z)hRq6i5+$JVmR!m4P>3yJ%lH)O&wtCyum3A*})*fHODD2nq!1@M>t@Za+ zH6{(Vf>_7!I-APmpsGLYpl7jww@s5hHOj5LCQXh)YAp+y{gG(0UMm(Ur z3o3n36oFwCkn+H*GZ-c6$Y!5r3z*@z0`NrB2C^q#LkOuooUM8Oek2KBk}o1PU8&2L z4iNkb5CqJWs58aR394iCU^ImDqV;q_Pp?pl=RB2372(Io^GA^+oKguO1(x$0<7w3z z)j{vnqEB679Rz4i4t;8|&Zg77UrklxY9@GDq(ZphH6=sW`;@uIt5B?7Oi?A0-BL}(#1&R;>2aFdq+E{jsvpNHjLx2t{@g1}c~DQcPNmVmy| zNMO@ewD^+T!|!DCOf}s9dLJU}(KZy@Jc&2Nq3^;vHTs}Hgcp`cw&gd7#N}nAFe3cM1TF%vKbKSffd&~FG9y$gLyr{#to)nxz5cCASEzQ}gz8O)phtHuKOW6p z@EQF(R>j%~P63Wfosrz8p(F=D|Mff~chUGn(<=CQbSiZ{t!e zeDU-pPsLgtc#d`3PYr$i*AaT!zF#23htIG&?QfcUk+@k$LZI}v+js|yuGmE!PvAV3 ztzh90rK-0L6P}s?1QH`Ot@ilbgMBzWIs zIs6K<_NL$O4lwR%zH4oJ+}JJp-bL6~%k&p)NGDMNZX7)0kni&%^sH|T?A)`z z=adV?!qnWx^B$|LD3BaA(G=ePL1+}8iu^SnnD;VE1@VLHMVdSN9$d)R(Wk{JEOp(P zm3LtAL$b^*JsQ0W&eLaoYag~=fRRdI>#FaELCO7L>zXe6w*nxN$Iy*Q*ftHUX0+N- zU>{D_;RRVPbQ?U+$^%{lhOMKyE5>$?U1aEPist+r)b47_LehJGTu>TcgZe&J{ z{q&D{^Ps~z7|zj~rpoh2I_{gAYNoCIJmio3B}$!5vTF*h$Q*vFj~qbo%bJCCRy509 zHTdDh_HYH8Zb9`}D5;;J9fkWOQi%Y$B1!b9+ESj+B@dtAztlY2O3NE<6HFiqOF&p_ zW-K`KiY@RPSY-p9Q99}Hcd05DT79_pfb{BV7r~?9pWh=;mcKBLTen%THFPo2NN~Nf zriOtFnqx}rtO|A6k!r6 zf-z?y-UD{dT0kT9FJ`-oWuPHbo+3wBS(}?2ql(+e@VTExmfnB*liCb zmeI+v5*+W_L;&kQN^ChW{jE0Mw#0Tfs}`9bk3&7UjxP^Ke(%eJu2{VnW?tu7Iqecm zB5|=-QdzK$=h50~{X3*w4%o1FS_u(dG2s&427$lJ?6bkLet}yYXCy)u_Io1&g^c#( z-$yYmSpxz{>BL;~c+~sxJIe1$7eZI_9t`eB^Pr0)5CuA}w;;7#RvPq|H6!byRzIJG ziQ7a4y_vhj(AL`8PhIm9edCv|%TX#f50lt8+&V+D4<}IA@S@#f4xId80oH$!_!q?@ zFRGGg2mTv&@76P7aTI{)Hu%>3QS_d)pQ%g8BYi58K~m-Ov^7r8BhX7YC1D3vwz&N8{?H*_U7DI?CI)+et?q|eGu>42NJ?K4SY zD?kc>h@%4IqNYuQ8m10+8xr2HYg2qFNdJl=Tmp&ybF>1>pqVfa%SsV*BY$d6<@iJA ziyvKnZ(~F9xQNokBgMci#pnZ}Igh0@S~cYcU_2Jfuf|d3tuH?ZSSYBfM(Y3-JBsC|S9c;# zyIMkPxgrq};0T09pjj#X?W^TFCMf1-9P{)g88;NDI+S4DXe>7d3Mb~i-h&S|Jy{J< zq3736$bH?@{!amD!1Ys-X)9V=#Z={fzsjVYMX5BG6%}tkzwC#1nQLj1y1f#}8**4Y zAvDZHw8)N)8~oWC88CgzbwOrL9HFbk4}h85^ptuu7A+uc#$f^9`EWv1Vr{5+@~@Uv z#B<;-nt;)!k|fRIg;2DZ(A2M2aC65kOIov|?Mhi1Sl7YOU4c$T(DoRQIGY`ycfkn% zViHzL;E*A{`&L?GP06Foa38+QNGA zw3+Wqs(@q+H{XLJbwZzE(omw%9~LPZfYB|NF5%j%E5kr_xE0u;i?IOIchn~VjeDZ) zAqsqhP0vu2&Tbz3IgJvMpKbThC-@=nk)!|?MIPP>MggZg{cUcKsP8|N#cG5 zUXMXxcXBF9`p>09IR?x$Ry3;q@x*%}G#lnB1}r#!WL88I@uvm}X98cZ8KO&cqT1p> z+gT=IxPsq%n4GWgh-Bk8E4!~`r@t>DaQKsjDqYc&h$p~TCh8_Mck5UB84u6Jl@kUZCU9BA-S!*bf>ZotFX9?a_^y%)yH~rsAz0M5#^Di80_tgoKw(egN z`)#(MqAI&A84J#Z<|4`Co8`iY+Cv&iboMJ^f9ROUK0Lm$;-T*c;TCTED_0|qfhlcS zv;BD*$Zko#nWPL}2K8T-?4}p{u)4xon!v_(yVW8VMpxg4Kh^J6WM{IlD{s?%XRT8P|yCU`R&6gwB~ zg}{At!iWCzOH37!ytcPeC`(({ovP7M5Y@bYYMZ}P2Z3=Y_hT)4DRk}wfeIo%q*M9UvXYJq!-@Ly79m5aLD{hf@BzQB>FdQ4mw z6$@vzSKF^Gnzc9vbccii)==~9H#KW<6)Uy1wb~auBn6s`ct!ZEos`WK8e2%<00b%# zY9Nvnmj@V^K(a_38dw-S*;G-(i(ETuIwyirs?$FFW@|66a38k+a%GLmucL%Wc8qk3 z?h_4!?4Y-xt)ry)>J`SuY**fuq2>u+)VZ+_1Egzctb*xJ6+7q`K$^f~r|!i?(07CD zH!)C_uerf-AHNa?6Y61D_MjGu*|wcO+ZMOo4q2bWpvjEWK9yASk%)QhwZS%N2_F4& z16D18>e%Q1mZb`R;vW{+IUoKE`y3(7p zplg5cBB)dtf^SdLd4n60oWie|(ZjgZa6L*VKq02Aij+?Qfr#1z#fwh92aV-HGd^_w zsucG24j8b|pk>BO7k8dS86>f-jBP^Sa}SF{YNn=^NU9mLOdKcAstv&GV>r zLxKHPkFxpvE8^r@MSF6UA}cG`#yFL8;kA7ccH9D=BGBtW2;H>C`FjnF^P}(G{wU;G z!LXLCbPfsGeLCQ{Ep$^~)@?v`q(uI`CxBY44osPcq@(rR-633!qa zsyb>?v%@X+e|Mg`+kRL*(;X>^BNZz{_kw5+K;w?#pReiw7eU8_Z^hhJ&fj80XQkuU z39?-z)6Fy$I`bEiMheS(iB6uLmiMd1i)cbK*9iPpl+h4x9ch7x- z1h4H;W_G?|)i`z??KNJVwgfuAM=7&Apd3vm#AT8uzQZ!NII}}@!j)eIfn53h{NmN7 zAKG6SnKP%^k&R~m5#@_4B@V?hYyHkm>0SQ@PPiw*@Tp@UhP-?w@jW?nxXuCipMW=L zH*5l*d@+jXm0tIMP_ec6Jcy6$w(gKK@xBX8@%oPaSyG;13qkFb*LuVx3{AgIyy&n3 z@R2_DcEn|75_?-v5_o~%xEt~ONB>M~tpL!nOVBLPN&e5bn5>+7o0?Nm|EGJ5 zmUbF{u|Qn?cu5}n4@9}g(G1JxtzkKv(tqwm_?1`?YSVA2IS4WI+*(2D*wh&6MIEhw z+B+2U<&E&|YA=3>?^i6)@n1&&;WGHF-pqi_sN&^C9xoxME5UgorQ_hh1__zzR#zVC zOQt4q6>ME^iPJ37*(kg4^=EFqyKH@6HEHXy79oLj{vFqZGY?sVjk!BX^h$SFJlJnv z5uw~2jLpA)|0=tp>qG*tuLru?-u`khGG2)o{+iDx&nC}eWj3^zx|T`xn5SuR;Aw8U z`p&>dJw`F17@J8YAuW4=;leBE%qagVTG5SZdh&d)(#ZhowZ|cvWvGMMrfVsbg>_~! z19fRz8CSJdrD|Rl)w!uznBF&2-dg{>y4l+6(L(vzbLA0Bk&`=;oQQ>(M8G=3kto_) zP8HD*n4?MySO2YrG6fwSrVmnesW+D&fxjfEmp=tPd?RKLZJcH&K(-S+x)2~QZ$c(> zru?MND7_HPZJVF%wX(49H)+~!7*!I8w72v&{b={#l9yz+S_aVPc_So%iF8>$XD1q1 zFtucO=rBj0Ctmi0{njN8l@}!LX}@dwl>3yMxZ;7 z0Ff2oh8L)YuaAGOuZ5`-p%Z4H@H$;_XRJQ|&(MhO78E|nyFa158gAxG^SP(vGi^+< zChY}o(_=ci3Wta#|K6MVljNe0T$%Q5ylx-v`R)r8;3+VUpp-)7T`-Y&{Zk z*)1*2MW+_eOJtF5tCMDV`}jg-R(_IzeE9|MBKl;a7&(pCLz}5<Zf+)T7bgNUQ_!gZtMlw=8doE}#W+`Xp~1DlE=d5SPT?ymu!r4z%&#A-@x^=QfvDkfx5-jz+h zoZ1OK)2|}_+UI)i9%8sJ9X<7AA?g&_Wd7g#rttHZE;J*7!e5B^zdb%jBj&dUDg4&B zMMYrJ$Z%t!5z6=pMGuO-VF~2dwjoXY+kvR>`N7UYfIBMZGP|C7*O=tU z2Tg_xi#Q3S=1|=WRfZD;HT<1D?GMR%5kI^KWwGrC@P2@R>mDT^3qsmbBiJc21kip~ zZp<7;^w{R;JqZ)C4z-^wL=&dBYj9WJBh&rd^A^n@07qM$c+kGv^f+~mU5_*|eePF| z3wDo-qaoRjmIw<2DjMTG4$HP{z54_te_{W^gu8$r=q0JgowzgQPct2JNtWPUsjF8R zvit&V8$(;7a_m%%9TqPkCXYUp&k*MRcwr*24>hR! z$4c#E=PVE=P4MLTUBM z7#*RDe0}=B)(3cvNpOmWa*eH#2HR?NVqXdJ=hq);MGD07JIQQ7Y0#iD!$C+mk7x&B zMwkS@H%>|fmSu#+ zI!}Sb(%o29Vkp_Th>&&!k7O>Ba#Om~B_J{pT7BHHd8(Ede(l`7O#`_}19hr_?~JP9 z`q(`<)y>%)x;O7)#-wfCP{?llFMoH!)ZomgsOYFvZ1DxrlYhkWRw#E-#Qf*z@Y-EQ z1~?_=c@M4DO@8AzZ2hKvw8CgitzI9yFd&N1-{|vP#4IqYb*#S0e3hrjsEGlnc4xwk z4o!0rxpUt8j&`mJ8?+P8G{m^jbk)bo_UPM+ifW*y-A*et`#_Ja_3nYyRa9fAG1Xr5 z>#AM_@PY|*u)DGRWJihZvgEh#{*joJN28uN7;i5{kJ*Gb-TERfN{ERe_~$Es~NJCpdKLRvdj4658uYYx{ng7I<6j~w@p%F<7a(Ssib|j z51;=Py(Nu*#hnLx@w&8X%=jrADn3TW>kplnb zYbFIWWVQXN7%Cwn6KnR)kYePEBmvM45I)UJb$)ninpdYg3a5N6pm_7Q+9>!_^xy?k za8@tJ@OOs-pRAAfT>Nc2x=>sZUs2!9Dwa%TTmDggH4fq(x^MW>mcRyJINlAqK$YQCMgR8`>6=Sg$ zFnJZsA8xUBXIN3i70Q%8px@yQPMgVP=>xcPI38jNJK<=6hC={a07+n@R|$bnhB)X$ z(Zc%tadp70vBTnW{OUIjTMe38F}JIH$#A}PB&RosPyFZMD}q}5W%$rh>5#U;m`z2K zc(&WRxx7DQLM-+--^w*EWAIS%bi>h587qkwu|H=hma3T^bGD&Z!`u(RKLeNZ&pI=q$|HOcji(0P1QC!YkAp*u z3%S$kumxR}jU<@6`;*-9=5-&LYRA<~uFrwO3U0k*4|xUTp4ZY7;Zbjx|uw&BWU$zK(w55pWa~#=f$c zNDW0O68N!xCy>G}(CX=;8hJLxAKn@Aj(dbZxO8a$+L$jK8$N-h@4$i8)WqD_%Snh4 zR?{O%k}>lr>w$b$g=VP8mckcCrjnp>uQl5F_6dPM8FWRqs}h`DpfCv20uZhyY~tr8 zkAYW4#yM;*je)n=EAb(q@5BWD8b1_--m$Q-3wbh1hM{8ihq7UUQfg@)l06}y+#=$( z$x>oVYJ47zAC^>HLRE-!HitjUixP6!R98WU+h>zct7g4eD;Mj#FL*a!VW!v-@b(Jv zj@@xM5noCp5%Vk3vY{tyI#oyDV7<$`KG`tktVyC&0DqxA#>V;-3oH%NW|Q&=UQ&zU zXNIT67J4D%5R1k#bW0F}TD`hlW7b)-=-%X4;UxQ*u4bK$mTAp%y&-(?{sXF%e_VH6 zTkt(X)SSN|;8q@8XX6qfR;*$r#HbIrvOj*-5ND8RCrcw4u8D$LXm5zlj@E5<3S0R# z??=E$p{tOk96$SloZ~ARe5`J=dB|Nj?u|zy2r(-*(q^@YwZiTF@QzQyPx_l=IDKa) zqD@0?IHJqSqZ_5`)81?4^~`yiGh6>7?|dKa8!e|}5@&qV!Iu9<@G?E}Vx9EzomB3t zEbMEm$TKGwkHDpirp;FZD#6P5qIlQJ8}rf;lHoz#h4TFFPYmS3+8(13_Mx2`?^=8S z|0)0&dQLJTU6{b%*yrpQe#OKKCrL8}YKw+<#|m`SkgeoN69TzIBQOl_Yg)W*w?NW) z*WxhEp$zQBBazJSE6ygu@O^!@Fr46j=|K`Mmb~xbggw7<)BuC@cT@Bwb^k?o-A zKX^9AyqR?zBtW5UA#siILztgOp?r4qgC`9jYJG_fxlsVSugGprremg-W(K0{O!Nw-DN%=FYCyfYA3&p*K>+|Q}s4rx#CQK zNj^U;sLM#q8}#|PeC$p&jAjqMu(lkp-_50Y&n=qF9`a3`Pr9f;b`-~YZ+Bb0r~c+V z*JJ&|^T{}IHkwjNAaM^V*IQ;rk^hnnA@~?YL}7~^St}XfHf6OMMCd9!vhk#gRA*{L zp?&63axj|Si%^NW05#87zpU_>QpFNb+I00v@cHwvdBn+Un)n2Egdt~LcWOeBW4Okm zD$-e~RD+W|UB;KQ;a7GOU&%p*efGu2$@wR74+&iP8|6#_fmnh^WcJLs)rtz{46);F z4v0OL{ZP9550>2%FE(;SbM*#sqMl*UXOb>ch`fJ|(*bOZ9=EB1+V4fkQ)hjsm3-u^Pk-4ji_uDDHdD>84tER!MvbH`*tG zzvbhBR@}Yd`azQGavooV=<WbvWLlO#x`hyO34mKcxrGv=`{ssnP=0Be5#1B;Co9 zh{TR>tjW2Ny$ZxJpYeg57#0`GP#jxDCU0!H15nL@@G*HLQcRdcsUO3sO9xvtmUcc{F*>FQZcZ5bgwaS^k-j5mmt zI7Z{Xnoml|A(&_{imAjK!kf5>g(oDqDI4C{;Bv162k8sFNr;!qPa2LPh>=1n z=^_9)TsLDvTqK7&*Vfm5k;VXjBW^qN3Tl&}K=X5)oXJs$z3gk0_+7`mJvz{pK|FVs zHw!k&7xVjvY;|(Py<;J{)b#Yjj*LZO7x|~pO4^MJ2LqK3X;Irb%nf}L|gck zE#55_BNsy6m+W{e zo!P59DDo*s@VIi+S|v93PwY6d?CE=S&!JLXwE9{i)DMO*_X90;n2*mPDrL%{iqN!?%-_95J^L z=l<*{em(6|h7DR4+4G3Wr;4*}yrBkbe3}=p7sOW1xj!EZVKSMSd;QPw>uhKK z#>MlS@RB@-`ULv|#zI5GytO{=zp*R__uK~R6&p$q{Y{iNkg61yAgB8C^oy&``{~FK z8hE}H&nIihSozKrOONe5Hu?0Zy04U#0$fB7C6y~?8{or}KNvP)an=QP&W80mj&8WL zEZQF&*FhoMMG6tOjeiCIV;T{I>jhi9hiUwz?bkX3NS-k5eWKy)Mo_orMEg4sV6R6X&i-Q%JG;Esl+kLpn@Bsls9O|i9z`tKB^~1D5)RIBB&J<6T@a4$pUvh$IR$%ubH)joi z!7>ON0DPwx=>0DA>Bb^c?L8N0BBrMl#oDB+GOXJh;Y&6I)#GRy$W5xK%a;KS8BrER zX)M>Rdoc*bqP*L9DDA3lF%U8Yzb6RyIsW@}IKq^i7v&{LeIc=*ZHIbO68x=d=+0T( zev=DT9f|x!IWZNTB#N7}V4;9#V$%Wo0%g>*!MdLOEU>My0^gni9ocID{$g9ytD!gy zKRWT`DVN(lcYjR|(}f0?zgBa3SwunLfAhx><%u0uFkrdyqlh8_g zDKt#R6rA2(Vm2LW_>3lBNYKG_F{TEnnKWGGC15y&OebIRhFL4TeMR*v9i0wPoK#H< zu4){s4K&K)K(9~jgGm;H7lS7y_RYfS;&!Oj5*eqbvEcW^a*i67nevzOZxN6F+K~A%TYEtsAVsR z@J=1hc#Dgs7J2^FL|qV&#WBFQyDtEQ2kPO7m2`)WFhqAob)Y>@{crkil6w9VoA?M6 zADGq*#-hyEVhDG5MQj677XmcWY1_-UO40QEP&+D)rZoYv^1B_^w7zAvWGw&pQyCyx zD|ga$w!ODOxxGf_Qq%V9Z7Q2pFiUOIK818AGeZ-~*R zI1O|SSc=3Z?#61Rd|AXx2)K|F@Z1@x!hBBMhAqiU)J=U|Y)T$h3D?ZPPQgkSosnN! zIqw-t$0fqsOlgw3TlHJF*t$Q@bg$9}A3X=cS@-yU3_vNG_!#9}7=q7!LZ?-%U26W4 z$d>_}*s1>Ac%3uFR;tnl*fNlylJ)}r2^Q3&@+is3BIv<}x>-^_ng;jhdaM}6Sg3?p z0jS|b%QyScy3OQ(V*~l~bK>VC{9@FMuW_JUZO?y(V?LKWD6(MXzh}M3r3{7b4eB(#`(q1m{>Be%_<9jw8HO!x#yF6vez$c#kR+}s zZO-_;25Sxngd(}){zv?ccbLqRAlo;yog>4LH&uZUK1n>x?u49C)Y&2evH5Zgt~666 z_2_z|H5AO5Iqxv_Bn~*y1qzRPcob<+Otod5Xd2&z=C;u+F}zBB@b^UdGdUz|s!H}M zXG%KiLzn3G?FZgdY&3pV$nSeY?ZbU^jhLz9!t0K?ep}EFNqR1@E!f*n>x*!uO*~JF zW9UXWrVgbX1n#76_;&0S7z}(5n-bqnII}_iDsNqfmye@)kRk`w~1 z6j4h4BxcPe6}v)xGm%=z2#tB#^KwbgMTl2I*$9eY|EWAHFc3tO48Xo5rW z5oHD!G4kb?MdrOHV=A+8ThlIqL8Uu+7{G@ zb)cGBm|S^Eh5= z^E^SZ=yeC;6nNCdztw&TdnIz}^Of@Ke*@vjt)0g>Y!4AJvWiL~e7+9#Ibhe)> ziNwh>gWZL@FlWc)wzihocz+%+@*euwXhW%Hb>l7tf8aJe5_ZSH1w-uG|B;9qpcBP0 zM`r1Hu#htOl)4Cl1c7oY^t0e4Jh$-I(}M5kzWqh{F=g&IM#JiC`NDSd@BCKX#y<P@Gwl$3a3w z6<(b|K(X5FIR22M)sy$4jY*F4tT{?wZRI+KkZFb<@j@_C316lu1hq2hA|1wCmR+S@ zRN)YNNE{}i_H`_h&VUT5=Y(lN%m?%QX;6$*1P}K-PcPx>*S55v)qZ@r&Vcic-sjkm z! z=nfW&X`}iAqa_H$H%z3Tyz5&P3%+;93_0b;zxLs)t#B|up}JyV$W4~`8E@+BHQ+!y zuIo-jW!~)MN$2eHwyx-{fyGjAWJ(l8TZtUp?wZWBZ%}krT{f*^fqUh+ywHifw)_F> zp76_kj_B&zFmv$FsPm|L7%x-j!WP>_P6dHnUTv!9ZWrrmAUteBa`rT7$2ixO;ga8U z3!91micm}{!Btk+I%pMgcKs?H4`i+=w0@Ws-CS&n^=2hFTQ#QeOmSz6ttIkzmh^`A zYPq)G1l3h(E$mkyr{mvz*MP`x+PULBn%CDhltKkNo6Uqg!vJ#DA@BIYr9TQ`18Un2 zv$}BYzOQuay9}w(?JV63F$H6WmlYPPpH=R|CPb%C@BCv|&Q|&IcW7*LX?Q%epS z`=CPx{1HnJ9_46^=0VmNb>8JvMw-@&+V8SDLRYsa>hZXEeRbtf5eJ>0@Ds47zIY{N z42EOP9J8G@MXXdeiPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$?lu1NER9Fe^SItioK@|V(ZWmgL zZT;XwPgVuWM>O%^|Dc$VK;n&?9!&g5)aVsG8cjs5UbtxVVnQNOV~7Mrg3+jnU;rhE z6fhW6P)R>_eXrXo-RW*y6RQ_qcb^s1wTu$TwriZ`=JUws>vRi}5x}MW1MR#7p|gIWJlaLK;~xaN}b< z<-@=RX-%1mt`^O0o^~2=CD7pJ<<$Rp-oUL-7PuG>do^5W_Mk#unlP}6I@6NPxY`Q} zuXJF}!0l)vwPNAW;@5DjPRj?*rZxl zwn;A(cFV!xe^CUu+6SrN?xe#mz?&%N9QHf~=KyK%DoB8HKC)=w=3E?1Bqj9RMJs3U z5am3Uv`@+{jgqO^f}Lx_Jp~CoP3N4AMZr~4&d)T`R?`(M{W5WWJV^z~2B|-oih@h^ zD#DuzGbl(P5>()u*YGo*Och=oRr~3P1wOlKqI)udc$|)(bacG5>~p(y>?{JD7nQf_ z*`T^YL06-O>T(s$bi5v~_fWMfnE7Vn%2*tqV|?~m;wSJEVGkNMD>+xCu#um(7}0so zSEu7?_=Q64Q5D+fz~T=Rr=G_!L*P|(-iOK*@X8r{-?oBlnxMNNgCVCN9Y~ocu+?XA zjjovJ9F1W$Nf!{AEv%W~8oahwM}4Ruc+SLs>_I_*uBxdcn1gQ^2F8a*vGjgAXYyh? zWCE@c5R=tbD(F4nL9NS?$PN1V_2*WR?gjv3)4MQeizuH`;sqrhgykEzj z593&TGlm3h`sIXy_U<7(dpRXGgp0TB{>s?}D{fwLe>IV~exweOfH!qM@CV5kib!YA z6O0gvJi_0J8IdEvyP#;PtqP*=;$iI2t(xG2YI-e!)~kaUn~b{6(&n zp)?iJ`z2)Xh%sCV@BkU`XL%_|FnCA?cVv@h*-FOZhY5erbGh)%Q!Av#fJM3Csc_g zC2I6x%$)80`Tkz#KRA!h1FzY`?0es3t!rKDT5EjPe6B=BLPr7s0GW!if;Ip^!AmGW zL;$`Vdre+|FA!I4r6)keFvAx3M#1`}ijBHDzy)3t0gwjl|qC2YB`SSxFKHr(oY#H$)x{L$LL zBdLKTlsOrmb>T0wd=&6l3+_Te>1!j0OU8%b%N342^opKmT)gni(wV($s(>V-fUv@0p8!f`=>PxC|9=nu ze{ToBBj8b<{PLfXV$h8YPgA~E!_sF9bl;QOF{o6t&JdsX?}rW!_&d`#wlB6T_h;Xf zl{4Tz5>qjF4kZgjO7ZiLPRz_~U@k5%?=30+nxEh9?s78gZ07YHB`FV`4%hlQlMJe@J`+e(qzy+h(9yY^ckv_* zb_E6o4p)ZaWfraIoB2)U7_@l(J0O%jm+Or>8}zSSTkM$ASG^w3F|I? z$+eHt7T~04(_WfKh27zqS$6* zzyy-ZyqvSIZ0!kkSvHknm_P*{5TKLQs8S6M=ONuKAUJWtpxbL#2(_huvY(v~Y%%#~ zYgsq$JbLLprKkV)32`liIT$KKEqs$iYxjFlHiRNvBhxbDg*3@Qefw4UM$>i${R5uB zhvTgmqQsKA{vrKN;TSJU2$f9q=y{$oH{<)woSeV>fkIz6D8@KB zf4M%v%f5U2?<8B(xn}xV+gWP?t&oiapJhJbfa;agtz-YM7=hrSuxl8lAc3GgFna#7 zNjX7;`d?oD`#AK+fQ=ZXqfIZFEk{ApzjJF0=yO~Yj{7oQfXl+6v!wNnoqwEvrs81a zGC?yXeSD2NV!ejp{LdZGEtd1TJ)3g{P6j#2jLR`cpo;YX}~_gU&Gd<+~SUJVh+$7S%`zLy^QqndN<_9 zrLwnXrLvW+ew9zX2)5qw7)zIYawgMrh`{_|(nx%u-ur1B7YcLp&WFa24gAuw~& zKJD3~^`Vp_SR$WGGBaMnttT)#fCc^+P$@UHIyBu+TRJWbcw4`CYL@SVGh!X&y%!x~ zaO*m-bTadEcEL6V6*{>irB8qT5Tqd54TC4`h`PVcd^AM6^Qf=GS->x%N70SY-u?qr>o2*OV7LQ=j)pQGv%4~z zz?X;qv*l$QSNjOuQZ>&WZs2^@G^Qas`T8iM{b19dS>DaXX~=jd4B2u`P;B}JjRBi# z_a@&Z5ev1-VphmKlZEZZd2-Lsw!+1S60YwW6@>+NQ=E5PZ+OUEXjgUaXL-E0fo(E* zsjQ{s>n33o#VZm0e%H{`KJi@2ghl8g>a~`?mFjw+$zlt|VJhSU@Y%0TWs>cnD&61fW4e0vFSaXZa4-c}U{4QR8U z;GV3^@(?Dk5uc@RT|+5C8-24->1snH6-?(nwXSnPcLn#X_}y3XS)MI_?zQ$ZAuyg+ z-pjqsw}|hg{$~f0FzmmbZzFC0He_*Vx|_uLc!Ffeb8#+@m#Z^AYcWcZF(^Os8&Z4g zG)y{$_pgrv#=_rV^D|Y<_b@ICleUv>c<0HzJDOsgJb#Rd-Vt@+EBDPyq7dUM9O{Yp zuGUrO?ma2wpuJuwl1M=*+tb|qx7Doj?!F-3Z>Dq_ihFP=d@_JO;vF{iu-6MWYn#=2 zRX6W=`Q`q-+q@Db|6_a1#8B|#%hskH82lS|9`im0UOJn?N#S;Y0$%xZw3*jR(1h5s z?-7D1tnIafviko>q6$UyqVDq1o@cwyCb*})l~x<@s$5D6N=-Uo1yc49p)xMzxwnuZ zHt!(hu-Ek;Fv4MyNTgbW%rPF*dB=;@r3YnrlFV{#-*gKS_qA(G-~TAlZ@Ti~Yxw;k za1EYyX_Up|`rpbZ0&Iv#$;eC|c0r4XGaQ-1mw@M_4p3vKIIpKs49a8Ns#ni)G314Z z8$Ei?AhiT5dQGWUYdCS|IC7r z=-8ol>V?u!n%F*J^^PZ(ONT&$Ph;r6X;pj|03HlDY6r~0g~X#zuzVU%a&!fs_f|m?qYvg^Z{y?9Qh7Rn?T*F%7lUtA6U&={HzhYEzA`knx1VH> z{tqv?p@I(&ObD5L4|YJV$QM>Nh-X3cx{I&!$FoPC_2iIEJfPk-$;4wz>adRu@n`_y z_R6aN|MDHdK;+IJmyw(hMoDCFCQ(6?hCAG5&7p{y->0Uckv# zvooVuu04$+pqof777ftk<#42@KQ((5DPcSMQyzGOJ{e9H$a9<2Qi_oHjl{#=FUL9d z+~0^2`tcvmp0hENwfHR`Ce|<1S@p;MNGInXCtHnrDPXCKmMTZQ{HVm_cZ>@?Wa6}O zHsJc7wE)mc@1OR2DWY%ZIPK1J2p6XDO$ar`$RXkbW}=@rFZ(t85AS>>U0!yt9f49^ zA9@pc0P#k;>+o5bJfx0t)Lq#v4`OcQn~av__dZ-RYOYu}F#pdsl31C^+Qgro}$q~5A<*c|kypzd} ziYGZ~?}5o`S5lw^B{O@laad9M_DuJle- z*9C7o=CJh#QL=V^sFlJ0c?BaB#4bV^T(DS6&Ne&DBM_3E$S^S13qC$7_Z?GYXTpR@wqr70wu$7+qvf-SEUa5mdHvFbu^7ew!Z1a^ zo}xKOuT*gtGws-a{Tx}{#(>G~Y_h&5P@Q8&p!{*s37^QX_Ibx<6XU*AtDOIvk|^{~ zPlS}&DM5$Ffyu-T&0|KS;Wnaqw{9DB&B3}vcO14wn;)O_e@2*9B&0I_ zZz{}CMxx`hv-XouY>^$Y@J(_INeM>lIQI@I>dBAqq1)}?Xmx(qRuX^i4IV%=MF306 z9g)i*79pP%_7Ex?m6ag-4Tlm=Z;?DQDyC-NpUIb#_^~V_tsL<~5<&;Gf2N+p?(msn zzUD~g>OoW@O}y0@Z;RN)wjam`CipmT&O7a|YljZqU=U86 zedayEdY)2F#BJ6xvmW8K&ffdS*0!%N<%RB!2~PAT4AD*$W7yzHbX#Eja9%3aD+Ah2 zf#T;XJW-GMxpE=d4Y>}jE=#U`IqgSoWcuvgaWQ9j1CKzG zDkoMDDT)B;Byl3R2PtC`ip=yGybfzmVNEx{xi_1|Cbqj>=FxQc{g`xj6fIfy`D8fA z##!-H_e6o0>6Su&$H2kQTujtbtyNFeKc}2=|4IfLTnye#@$Au7Kv4)dnA;-fz@D_8 z)>irG$)dkBY~zX zC!ZXLy*L3xr6cb70QqfN#Q>lFIc<>}>la4@3%7#>a1$PU&O^&VszpxLC%*!m-cO{B z-Y}rQr4$84(hvy#R69H{H zJ*O#uJh)TF6fbXy;fZkk%X=CjsTK}o5N1a`d7kgYYZLPxsHx%9*_XN8VWXEkVJZ%A z1A+5(B;0^{T4aPYr8%i@i32h)_)|q?9vws)r+=5u)1YNftF5mknwfd*%jXA2TeP}Z zQ!m?xJ3?9LpPM?_A3$hQ1QxNbR&}^m z!F999s?p^ak#C4NM_x2p9FoXWJ$>r?lJ)2bG)sX{gExgLA2s5RwHV!h6!C~d_H||J z>9{E{mEv{Z1z~65Vix@dqM4ZqiU|!)eWX$mwS5mLSufxbpBqqS!jShq1bmwCR6 z4uBri7ezMeS6ycaXPVu(i2up$L; zjpMtB`k~WaNrdgM_R=e#SN?Oa*u%nQy01?()h4A(jyfeNfx;5o+kX?maO4#1A^L}0 zYNyIh@QVXIFiS0*tE}2SWTrWNP3pH}1Vz1;E{@JbbgDFM-_Mky^7gH}LEhl~Ve5PexgbIyZ(IN%PqcaV@*_`ZFb=`EjspSz%5m2E34BVT)d=LGyHVz@-e%9Ova*{5@RD;7=Ebkc2GP%pIP^P7KzKapnh`UpH?@h z$RBpD*{b?vhohOKf-JG3?A|AX|2pQ?(>dwIbWhZ38GbTm4AImRNdv_&<99ySX;kJ| zo|5YgbHZC#HYgjBZrvGAT4NZYbp}qkVSa;C-LGsR26Co+i_HM&{awuO9l)Ml{G8zD zs$M8R`r+>PT#Rg!J(K6T4xHq7+tscU(}N$HY;Yz*cUObX7J7h0#u)S7b~t^Oj}TBF zuzsugnst;F#^1jm>22*AC$heublWtaQyM6RuaquFd8V#hJ60Z3j7@bAs&?dD#*>H0SJaDwp%U~27>zdtn+ z|8sZzklZy$%S|+^ie&P6++>zbrq&?+{Yy11Y>@_ce@vU4ZulS@6yziG6;iu3Iu`M= zf3rcWG<+3F`K|*(`0mE<$89F@jSq;j=W#E>(R}2drCB7D*0-|D;S;(;TwzIJkGs|q z2qH{m_zZ+el`b;Bv-#bQ>}*VPYC|7`rgBFf2oivXS^>v<&HHTypvd4|-zn|=h=TG{ z05TH2+{T%EnADO>3i|CB zCu60#qk`}GW{n4l-E$VrqgZGbI zbQW690KgZt4U3F^5@bdO1!xu~p@7Y~*_FfWg2CdvED5P5#w#V46LH`<&V0{t&Ml~4 zHNi7lIa+#i+^Z6EnxO7KJQw)wD)4~&S-Ki8)3=jpqxmx6c&zU&<&h%*c$I(5{1HZT zc9WE}ijcWJiVa^Q^xC|WX0habl89qycOyeViIbi(LFsEY_8a|+X^+%Qv+W4vzj>`y zpuRnjc-eHNkvXvI_f{=*FX=OKQzT?bck#2*qoKTHmDe>CDb&3AngA1O)1b}QJ1Tun z_<@yVEM>qG7664Pa@dzL@;DEh`#?yM+M|_fQS<7yv|i*pw)|Z8)9IR+QB7N3v3K(wv4OY*TXnH&X0nQB}?|h2XQeGL^q~N7N zDFa@x0E(UyN7k9g%IFq7Sf+EAfE#K%%#`)!90_)Dmy3Bll&e1vHQyPA87TaF(xbqMpDntVp?;8*$87STop$!EAnGhZ?>mqPJ(X zFsr336p3P{PpZCGn&^LP(JjnBbl_3P3Kcq+m}xVFMVr1zdCPJMDIV_ki#c=vvTwbU z*gKtfic&{<5ozL6Vfpx>o2Tts?3fkhWnJD&^$&+Mh5WGGyO7fG@6WDE`tEe(8<;+q z@Ld~g08XDzF8xtmpIj`#q^(Ty{Hq>t*v`pedHnuj(0%L(%sjkwp%s}wMd!a<*L~9T z9MM@s)Km~ogxlqEhIw5(lc46gCPsSosUFsgGDr8H{mj%OzJz{N#;bQ;KkV+ZWA1(9 zu0PXzyh+C<4OBYQ0v3z~Lr;=C@qmt8===Ov2lJ1=DeLfq*#jgT{YQCuwz?j{&3o_6 zsqp2Z_q-YWJg?C6=!Or|b@(zxTlg$ng2eUQzuC<+o)k<6^9ju_Z*#x+oioZ5T8Z_L zz9^A1h2eFS0O5muq8;LuDKwOv4A9pxmOjgb6L*i!-(0`Ie^d5Fsgspon%X|7 zC{RRXEmYn!5zP9XjG*{pLa)!2;PJB2<-tH@R7+E1cRo=Wz_5Ko8h8bB$QU%t9#vol zAoq?C$~~AsYC|AQQ)>>7BJ@{Cal)ZpqE=gjT+Juf!RD-;U0mbV1ED5PbvFD6M=qj1 zZ{QERT5@(&LQ~1X9xSf&@%r|3`S#ZCE=sWD`D4YQZ`MR`G&s>lN{y2+HqCfvgcw3E z-}Kp(dfGG?V|97kAHQX+OcKCZS`Q%}HD6u*e$~Ki&Vx53&FC!x94xJd4F2l^qQeFO z?&JdmgrdVjroKNJx64C!H&Vncr^w zzR#XI}Dn&o8jB~_YlVM^+#0W(G1LZH5K^|uYT@KSR z^Y5>^*Bc45E1({~EJB(t@4n9gb-eT#s@@7)J^^<_VV`Pm!h7av8XH6^5zO zOcQBhTGr;|MbRsgxCW69w{bl4EW#A~);L?d4*y#j8Ne=Z@fmJP0k4{_cQ~KA|Y#_#BuUiYx8y*za3_6Y}c=GSe7(2|KAfhdzud!Zq&}j)=o4 z7R|&&oX7~e@~HmyOOsCCwy`AR+deNjZ3bf6ijI_*tKP*_5JP3;0d;L_p(c>W1b%sG zJ*$wcO$ng^aW0E(5ldckV9unU7}OB7s?Wx(761?1^&8tA5y0_(ieV>(x-e@}1`lWC z-YH~G$D>#ud!SxK2_Iw{K%92=+{4yb-_XC>ji&j7)1ofp(OGa4jjF;Hd*`6YQL+Jf zffg+6CPc8F@EDPN{Kn96yip;?g@)qgkPo^nVKFqY?8!=h$G$V=<>%5J&iVjwR!7H0 z$@QL|_Q81I;Bnq8-5JyNRv$Y>`sWl{qhq>u+X|)@cMlsG!{*lu?*H`Tp|!uv z9oEPU1jUEj@ueBr}%Y)7Luyi)REaJV>eQ{+uy4uh0ep0){t;OU8D*RZ& zE-Z-&=BrWQLAD^A&qut&4{ZfhqK1ZQB0fACP)=zgx(0(o-`U62EzTkBkG@mXqbjXm z>w`HNeQM?Is&4xq@BB(K;wv5nI6EXas)XXAkUuf}5uSrZLYxRCQPefn-1^#OCd4aO zzF=dQ*CREEyWf@n6h7(uXLNgJIwGp#Xrsj6S<^bzQ7N0B0N{XlT;`=m9Olg<>KL}9 zlp>EKTx-h|%d1Ncqa=wnQEuE;sIO-f#%Bs?g4}&xS?$9MG?n$isHky0caj za8W+B^ERK#&h?(x)7LLpOqApV5F>sqB`sntV%SV>Q1;ax67qs+WcssfFeF3Xk=e4^ zjR2^(%K1oBq%0%Rf!y&WT;lu2Co(rHi|r1_uW)n{<7fGc-c=ft7Z0Q}r4W$o$@tQF#i?jDBwZ8h+=SC}3?anUp3mtRVv9l#H?-UD;HjTF zQ*>|}e=6gDrgI9p%c&4iMUkQa4zziS$bO&i#DI$Wu$7dz7-}XLk%!US^XUIFf2obO zFCTjVEtkvYSKWB;<0C;_B{HHs~ax_48^Cml*mjfBC5*7^HJZiLDir(3k&BerVIZF8zF;0q80eX8c zPN4tc+Dc5DqEAq$Y3B3R&XPZ=AQfFMXv#!RQnGecJONe0H;+!f^h5x0wS<+%;D}MpUbTNUBA}S2n&U59-_5HKr{L^jPsV8B^%NaH|tUr)mq=qCBv_- ziZ1xUp(ZzxUYTCF@C}To;u60?RIfTGS?#JnB8S8@j`TKPkAa)$My+6ziGaBcA@){d z91)%+v2_ba7gNecdj^8*I4#<11l!{XKl6s0zkXfJPxhP+@b+5ev{a>p*W-3*25c&} zmCf{g9mPWVQ$?Sp*4V|lT@~>RR)9iNdN^7KT@>*MU3&v^3e?=NTbG9!h6C|9zO097 zN{Qs6YwR-5$)~ z`b~qs`a1Dbx8P>%V=1XGjBptMf%P~sl1qbHVm1HYpY|-Z^Dar8^HqjIw}xaeRlsYa zJ_@Apy-??`gxPmb`m`0`z`#G7*_C}qiSZe~l2z65tE~IwMw$1|-u&t|z-8SxliH00 zlh1#kuqB56s+E&PWQ7Nz17?c}pN+A@-c^xLqh(j;mS|?>(Pf7(?qd z5q@jkc^nA&!K-}-1P=Ry0yyze0W!+h^iW}7jzC1{?|rEFFWbE^Yu7Y}t?jmP-D$f+ zmqFT7nTl0HL|4jwGm7w@a>9 zKD)V~+g~ysmei$OT5}%$&LK8?ib|8aY|>W3;P+0B;=oD=?1rg+PxKcP(d;OEzq1CKA&y#boc51P^ZJPPS)z5 zAZ)dd2$glGQXFj$`XBBJyl2y-aoBA8121JC9&~|_nY>nkmW>TLi%mWdn-^Jks-Jv| zSR*wij;A3Fcy8KsDjQ15?Z9oOj|Qw2;jgJiq>dxG(2I2RE- z$As!#zSFIskebqU2bnoM^N<4VWD2#>!;saPSsY8OaCCQqkCMdje$C?Sp%V}f2~tG5 z0whMYk6tcaABwu*x)ak@n4sMElGPX1_lmv@bgdI2jPdD|2-<~Jf`L`@>Lj7{<-uLQ zE3S_#3e10q-ra=vaDQ42QUY^@edh>tnTtpBiiDVUk5+Po@%RmuTntOlE29I4MeJI?;`7;{3e4Qst#i-RH6s;>e(Sc+ubF2_gwf5Qi%P!aa89fx6^{~A*&B4Q zKTF|Kx^NkiWx=RDhe<{PWXMQ;2)=SC=yZC&mh?T&CvFVz?5cW~ritRjG2?I0Av_cI z)=s!@MXpXbarYm>Kj0wOxl=eFMgSMc?62U#2gM^li@wKPK9^;;0_h7B>F>0>I3P`{ zr^ygPYp~WVm?Qbp6O3*O2)(`y)x>%ZXtztz zMAcwKDr=TCMY!S-MJ8|2MJCVNUBI0BkJV6?(!~W!_dC{TS=eh}t#X+2D>Kp&)ZN~q zvg!ogxUXu^y(P*;Q+y_rDoGeSCYxkaGPldDDx)k;ocJvvGO#1YKoQLHUf2h_pjm&1 zqh&!_KFH03FcJvSdfgUYMp=5EpigZ*8}7N_W%Ms^WSQ4hH`9>3061OEcxmf~TcYn5_oHtscWn zo5!ayj<_fZ)vHu3!A!7M;4y1QIr8YGy$P2qDD_4+T8^=^dB6uNsz|D>p~4pF3Nrb6 zcpRK*($<~JUqOya#M1=#IhOZ zG)W+rJS-x(6EoVz)P zsSo>JtnChdj9^);su%SkFG~_7JPM zEDz3gk2T7Y%x>1tWyia|op(ilEzvAujW?Xwlw>J6d7yEi8E zv30riR|a_MM%ZZX&n!qm0{2agq(s?x9E@=*tyT$nND+{Djpm7Rsy!+c$j+wqMwTOF zZL8BQ|I`<^bGW)5apO{lh(Asqen?_U`$_n0-Ob~Yd%^89oEe%9yGumQ_8Be+l2k+n zCxT%s?bMpv|AdWP7M1LQwLm|x+igA~;+iK-*+tClF&ueX_V}>=4gvZ01xpubQWXD_ zi?Un>&3=$fu)dgk-Z;0Ll}HK5_YM->l^Czrd0^cJ))(DwL2g3aZuza7ga9^|mT_70 z))}A}r1#-(9cxtn<9jGRwOB4hb9kK@YCgjfOM-90I$8@l=H^`K$cyhe2mTM|FY9vW znH~h)I<_aa#V1xmhk?Ng@$Jw-s%a!$BI4Us+Df+?J&gKAF-M`v}j`OWKP3>6`X`tEmhe#y*(Xm$_^Ybbs=%;L7h zp7q^C*qM}Krqsinq|WolR99>_!GL#Z71Hhz|IwQQv<>Ds09B?Je(lhI1(FInO8mc} zl$RyKCUmfku+Cd^8s0|t+e}5g7M{ZPJQH=UB3(~U&(w#Bz#@DTDHy>_UaS~AtN>4O zJ-I#U@R($fgupHebcpuEBX`SZ>kN!rW$#9>s{^3`86ZRQRtYTY)hiFm_9wU3c`SC8 z-5M%g)h}3Pt|wyj#F%}pGC@VL`9&>9P+_UbudCkS%y2w&*o})hBplrB*@Z?gel5q+ z%|*59(sR9GMk3xME}wd%&k?7~J)OL`rK#4d-haC7uaU8-L@?$K6(r<0e<;y83rK&` z3Q!1rD9WkcB8WBQ|WT|$u^lkr0UL4WH4EQTJyk@5gzHb18cOte4w zS`fLv8q;PvAZyY;*Go3Qw1~5#gP0D0ERla6M6#{; zr1l?bR}Nh+OC7)4bfAs(0ZD(axaw6j9v`^jh5>*Eo&$dAnt?c|Y*ckEORIiJXfGcM zEo`bmIq6rJm`XhkXR-^3d8^RTK2;nmVetHfUNugJG(4XLOu>HJA;0EWb~?&|0abr6 zxqVp@p=b3MN^|~?djPe!=eex(u!x>RYFAj|*T$cTi*Sd3Bme7Pri1tkK9N`KtRmXf zZYNBNtik97ct1R^vamQBfo9ZUR@k*LhIg8OR9d_{iv#t)LQV91^5}K5u{eyxwOFoU zHMVq$C>tfa@uNDW^_>EmO~WYQd(@!nKmAvSSIb&hPO|}g-3985t?|R&WZXvxS}Kt2i^eRe>WHb_;-K5cM4=@AN1>E&1c$k!w4O*oscx(f=<1K6l#8Exi)U(ZiZ zdr#YTP6?m1e1dOKysUjQ^>-MR={OuD00g6+(a^cvcmn#A_%Fh3Of%(qP5nvjS1=(> z|Ld8{u%(J}%2SY~+$4pjy{()5HN2MYUjg1X9umxOMFFPdM+IwOVEs4Z(olynvT%G) zt9|#VR}%O2@f6=+6uvbZv{3U)l;C{tuc zZ{K$rut=eS%3_~fQv^@$HV6#9)K9>|0qD$EV2$G^XUNBLM|5-ZmFF!KV)$4l^KVj@ zZ4fI}Knv*K%zPqK77}B-h_V{66VrmoZP2>@^euu8Rc}#qwRwt5uEBWcJJE5*5rT2t zA4Jpx`QQ~1Sh_n_a9x%Il!t1&B~J6p54zxAJx`REov${jeuL8h8x-z=?qwMAmPK5i z_*ES)BW(NZluu#Bmn1-NUKQip_X&_WzJy~J`WYxEJQ&Gu7DD< z&F9urE;}8S{x4{yB zaq~1Zrz%8)<`prSQv$eu5@1RY2WLu=waPTrn`WK%;G5(jt^FeM;gOdvXQjYhax~_> z{bS_`;t#$RYMu-;_Dd&o+LD<5Afg6v{NK?0d8dD5ohAN?QoocETBj?y{MB)jQ%UQ}#t3j&iL!qr@#6JEajR3@^k5wgLfI9S9dT2^f`2wd z%I#Q*@Ctk@w=(u)@QC}yBvUP&fFRR-uYKJ){Wp3&$s(o~W7OzgsUIPx0|ph2L1(r*_Pa@T@mcH^JxBjh09#fgo|W#gG7}|)k&uD1iZxb0 z@|Y)W79SKj9sS&EhmTD;uI#)FE6VwQ*YAr&foK$RI5H8_ripb$^=;U%gWbrrk4!5P zXDcyscEZoSH~n6VJu8$^6LE6)>+=o#Q-~*jmob^@191+Ot1w454e3)WMliLtY6~^w zW|n#R@~{5K#P+(w+XC%(+UcOrk|yzkEes=!qW%imu6>zjdb!B#`efaliKtN}_c!Jp zfyZa`n+Nx8;*AquvMT2;c8fnYszdDA*0(R`bsof1W<#O{v%O!1IO4WZe=>XBu_D%d zOwWDaEtX%@B>4V%f1+dKqcXT>m2!|&?}(GK8e&R=&w?V`*Vj)sCetWp9lr@@{xe6a zE)JL&;p}OnOO}Nw?vFyoccXT*z*?r}E8{uPtd;4<(hmX;d$rqJhEF}I+kD+m(ke;J z7Cm$W*CSdcD=RYEBhedg>tuT{PHqwCdDP*NkHv4rvQTXkzEn*Mb0oJz&+WfWIOS4@ zzpPJ|e%a-PIwOaOC7uQcHQ-q(SE(e@fj+7oC@34wzaBNaP;cw&gm{Z8yYX?V(lIv5 zKbg*zo1m5aGA4^lwJ|bAU=j3*d8S{vp!~fLFcK8s6%Ng55_qW_d*3R%e=34aDZPfD z&Le39j|ahp6E7B0*9OVdeMNrTErFatiE+=Z!XZ^tv0y%zZKXRTBuPyP&C{5(H?t)S zKV24_-TKpOmCPzU&by8R1Q5HY^@IDoeDA9MbgizgQ*F1Er~HVmvSU>vx}pZVQ&tr| zOtZl8vfY2#L<)gZ=ba&wG~EI*Vd?}lRMCf+!b5CDz$8~be-HKMo5omk$w7p4`Mym*IR8WiTz4^kKcUo^8Hkcsu14u z`Pkg`#-Y^A%CqJ0O@UF|caAulf68@(zhqp~YjzInh7qSN7Ov%Aj(Qz%{3zW|xubJ- ztNE_u_MO7Q_585r;xD?e=Er}@U1G@BKW5v$UM((eByhH2p!^g9W}99OD8VV@7d{#H zv)Eam+^K(5>-Ot~U!R$Um3prQmM)7DyK=iM%vy>BRX4#aH7*oCMmz07YB(EL!^%F7?CA#>zXqiYDhS;e?LYPTf(bte6B ztrfvDXYG*T;ExK-w?Knt{jNv)>KMk*sM^ngZ-WiUN;=0Ev^GIDMs=AyLg2V@3R z7ugNc45;4!RPxvzoT}3NCMeK$7j#q3r_xV(@t@OPRyoKBzHJ#IepkDsm$EJRxL)A* zf{_GQYttu^OXr$jHQn}zs$Eh|s|Z!r?Yi+bS-bi+PE*lH zo|6ztu6$r_?|B~S#m>imI!kQP9`6X426uHRri!wGcK;J;`%sFM(D#*Le~W*t2uH`Q z(HEO9-c_`mhA@4QhbW+tgtt9Pzx=_*3Kh~TB$SKmU4yx-Ay&)n%PZPKg#rD4H{%Ke zdMY@rf5EAFfqtrf?Vmk&N(_d-<=bvfOdPrYwY*;5%j@O6@O#Qj7LJTk-x3LN+dEKy+X z>~U8j3Ql`exr1jR>+S4nEy+4c2f{-Q!3_9)yY758tLGg7k^=nt<6h$YE$ltA+13S<}uOg#XHe6 zZHKdNsAnMQ_RIuB;mdoZ%RWpandzLR-BnjN2j@lkBbBd+?i ze*!5mC}!Qj(Q!rTu`KrRRqp22c=hF6<^v&iCDB`n7mHl;vdclcer%;{;=kA(PwdGG zdX#BWoC!leBC4);^J^tPkPbIe<)~nYb6R3u{HvC!NOQa?DC^Q`|_@ zcz;rk`a!4rSLAS>_=b@g?Yab4%=J3Cc7pRv8?_rHMl_aK*HSPU%0pG2Fyhef_biA!aW|-(( z*RIdG&Lmk(=(nk28Q1k1Oa$8Oa-phG%Mc6dT3>JIylcMMIc{&FsBYBD^n@#~>C?HG z*1&FpYVvXOU@~r2(BUa+KZv;tZ15#RewooEM0LFb>guQN;Z0EBFMFMZ=-m$a3;gVD z)2EBD4+*=6ZF?+)P`z@DOT;azK0Q4p4>NfwDR#Pd;no|{q_qB!zk1O8QojE;>zhPu z1Q=1z^0MYHo1*``H3ex|bW-Zy==5J4fE2;g6sq6YcXMYK5i|S^9(OSw#v!3^!EB<% zZF~J~CleS`V-peStyf*I%1^R88D;+8{{qN6-t!@gTARDg^w2`uSzFZbPQ!)q^oC}m zPo8VOQxq2BaIN`pAVFGu8!{p3}(+iZ`f4ck2ygVpEZMQW38nLpj3NQx+&sAkb8`}P3- zc>N*k6AG?r}bfO6_vccTuKX+*- z7W4Q#2``P0jIHYs)F>uG#AM#I6W2)!Nu2nD5{CRV_PmkDS2ditmbd#pggqEgAo%5oC?|CP zGa0CV)wA*ko!xC7pZYkqo{10CN_e00FX5SjWkI3?@XG}}bze!(&+k2$C-C`6temSk z_YyYpB^wh3woo`B zrMSTd4T?(X-jh`FeO76C(3xsOm9s2BP_b%ospg^!#*2*o9N;tf4(X9$qc_d(()yz5 zDk@1}u_Xd+86vy5RBs?LQCuYKCGPS;E4uFOi@V%1JTK&|eRf~lp$AV#;*#O}iRI2=i3rFL8{ zA^ptDZ0l6k-mq=hUJ0x$Y@J>UNfz~I5l63H(`~*v;qX`Z{zwsQQD-!wp0D&hyB8&Z z7$R07gIKGJ^%AvQ{4KM0edM39iFRx=P^6`!<1(s0t|JbB2tXs_B_IH9#ajH0C=-n+ z`nz`fKMBKLlf?2AC+|83M+0rqR%uhNGD;uKA6jOjp7YDe^4%0fRB<^bcjlS2KF~F; zu09wh1x0&4pG&76M;x8$u`b134t=dEPBn6PV|X29<#T4F1mxGF*HOgiWU8tN@cguI z_F@o+XL7FJztR63wC|j4x_DANzcX94r7Iz-O2x$({&qd*mdLG=-Rv)uZ}UlMR+F&q zU}=lkfb0p1>1Ho){o$@}mSKIV;h*$AND7~Dl)QzpFBlSM99Kx+F7GsVK5xcR? z_4Q(Z%cgk8ST}U;;=!LwyZVu^S$>B-Waeik%wzcKTIqeX=0FP(TGQ=nxi=dsS5BYF zl@?}NT!Y!Iyos^@v7XWXA{_bV~1lxz7gC?xuXxy0_?GaN!AhRRM5>)^t%&ODd;@HN5L{MD3 zc>i2keQZVm#?NrDwbfd}_<*5^U&w0zv~n-y8=GGN-!=_`FU^cM8oVCWRFxw?BM^YD zi=Vxz4q|jwPTg+?q7_XI)-S@gQkh>w0ZUB}a{^ z_i;`Y(~fvpI!vmW*A^|P7(6+@C4UeL2WATf{P1?H5rk`5{TL zcf!CgP6Mi{MvjZS)rfo7JLDZK7M7ANd$3`{j9baD*7{#Zu-33fOYUzjvtKzR2)_T1I1s7fe&z|=)QkX;=`zX8!Byw-veM#yr;|wjO^II>!B*B z0+w%;0(=*G3V@88t!}~zx)&do(uF=073Yeh*fEhZb3Vn>t!m(9p~Y_FdV3IgR)9eT z)~e9xpI%2deTWyHlXA(7srrfc_`7ACm!R>SoIgkuF8 z!wkOhrixFy9y@)GdxAntd!!7@=L_tFD2T5OdSUO)I%yj02le`qeQ=yKq$g^h)NG;# za(0J@#VBi^5YI|QI=rq{KlxwGabZJ0dKmfWDROkcM}lUN$@DV`K7fU?8CP2H23QPi zG?YF*=Vn=kTK*#Y_{AQN&oLju|0#E=fx%YVh>S{puu&K$b;BN*jIo@VYhqPiJPzzM>#kxoy0vW9i;ne2_BIG0zyRFp<3M(iY(%*M_>q0ulV2K}Tg zkG{EWKS{i%4DUuHi%DVKy%e+Q!~Uf`>>F6NgD{{I8~nO4!VgOvtFOc7(O)X`|7n*f zxBa4CJ-v9fUUH+`7sPVvpM_C*udZ@OTGTzx56QM5y~OlrZc&w9=)B?nmd@keRn+^= zvm~4sa5987LFDnU{(N|N zJAR8H@}p1fC+H(yTI4n#%~TbImMpuqYn9cQ<0QQ%=PzZItLkC*ef9WJUvfITKWh#D zc#__8`4am9%#NslIUw+<82#SR8AYG|woLfBg#!-&dqq}@P>|I0%lbdy0lSMmNe+}o zj0zZuFr6Wb?Y{Qy-S=|r`bdrDmhnmvkRnkdn`YCleU>Q$=je}LGhh>_QAj6aa_0Oc z%Swsmui;IRx7bN*=AAS@5yW&Y2hy;3&|HAiA8}!HT6!Z!RVn~MZg`RmI6&%#tBZDx zfD+y@Z~NWlk*4l13vmt3AK2wP!fQlnBbECL>?p)F?T)<`w&QN>cP_V>r7UTcsTaaP zTOb$f!P@zf$6>890NVKbIkG8rE?9!Y97sMSZjfF?A zYR8lp`LMoz~O?iaZN;gcX;LC-%Ia*R%A&SLx!YIf29?P+=XAAojK8!^OU*@?R&DK!#G_lsn!#;S375uZ&B0HH1|BO0R90$U>qs zSvHv>H~mAgNCcjo-e+;RjY6B9NCbQrZ|BHjTkehaU<9CSkdd>Vl*ifA2LNOP&R2Qdy3k3-TQ+ zbq=#vI43x`s=%~cGyN&y4Y!FxhwgDe@i6uv8^BLL&3z*SO=D0aLjih?gY4-9uWp5or)H+v~w6n5X#F-I52z=Z_p4JB(;M| zeaVFhuR2|3UD2MzVc~^nSoD2(dD#uL_1PdnIxeA{V5n`#3xf1Zx@4lw(DsQ&H$h zw#%3O<1173hjg2_nhKi!d1ej=h7y`hVjCNB6|HTnx>SWuCE-kgTnfT+YGX4_Lun({ zDv2`>d3vrS)tTf7ps_vvh!Cx^e1BFuWnEAh0(7fkNk|-3oU|iRWdsC6U)?Raft~HN z;^$U}vZK5O8|LV$>6X5T(uYkblv{zwPxnQBh(BQ5tA~J!vGiAMYP^_ki~pkIxDfOZ zUJDwq%O~WueeV6%uN<54&u*c&E4y431cklBNrb06zGOOy4XNT~JS-q(s6@)F@ovbe ze`fial(O4(-su%6@@1+V0MsdLLMyE8;)nou(7}czU(5ASaZYDT(kUZ0L(&g$nF^n9 z9-Pi`ZZLX&)^*M6As4_2Mmc9S7OT)F8KkL2NJ)KJcnCuWU=Wy402A&45#Q9Id~BBH z0cY*xlv!uXzKrXLH!xQu(OtJvEj|0-DmRj1vjFz{c*I4$Pe(+_V|^b~S!0xm{8lq= zZv)@NlcyL3Xdz+*|L137F7y6L-2VsrKw=q^S>F6i%<{Fr8zk06$Ay-(!L$fY@7mcng!2}L0t zgi|KxfB63Xtk_Q8#ZPipQ@!zgjdpEIbK_?q17Hoi4Eiyun$hrc>T(7pOLVLQE=lgGwA+A308p& z7@=09(|$>eLy5gLe{*|3b(M;1n;C^~v?o88jYib48eR4$QGsBFzd}3QuwO^_XE(=B zq+hMi0UFC|dB{LCwch7;zYT=NK})O%sgi0k#yV;My@24^B1+CuZmYOh0^b)5Ba_)) zC%i#_Iev&nsu%I|1N5=MVc#PrlunKAs&hY|3s5;@}`>sB>}gzxuB zB=2vrRyB3uiyW(hkDUNe1@&(b`;>ZvGgw|@s{zVC#_`HXIN_^J@Etb zA7A+F?ot37T{<-vTy8h&b3e+WKHE1oh;pUQrN4yRRrx?mT_9jRa2i4l1fUnLW^Cbl z!I1>VzyFe?VELWWhM?@?t-YPZkD-Qjo@bC2(o#ZtZmr{KZsdFWItV`rs$gp{724@C zL8K5}E0+DHcWcL^{BGei4>@J-3%a#$y6;I}=upc};-NDv-z#kPX26ylOpH)Ov1uU{ zkLj6oiH6l_s+B~_z;|Jc2oi?naS7#3H63~~lWj4rUnd=fCnKdkik<@R&kch9q##G{ z4u!%=rlM~Yp3jk*t8}1B`Sv6<%Z^}~1e@aq zg|JQ`QO2pSjAm-g*?IrNc$^~sIrNBo2$m|Sxanr?Mfs>2@Auu49 zGXlsS<9XS1&8h(dD*Hl&5HBDG!^pJ*lkau_Ur+7`7z;rcs$hT4we?3bT=7Fe<>{5( z2m2(c+hUz2BTHM8dCe*Z3XX&Av;b~a=$6EF>&^E8%nyxO@m_n!q&XD^A{SRjRZQ0L~qDeC=j&0$j6=LNIz@`ni^>ch|sv}^6 zlm>?28yPl@WmDPR?Y-A9X{U9Dv_IsbXJnzKCjkRksLOg#42uG2mE_acbTQ4)J|1V>%U@K(FP3AYhL0U zdeOCPN1qLv!|#c=p!_+%VNV(GHt`RuLRV^vz<5tt-r)yOK**kUWPspVAf|}ZL{LS= z@k(@@!P&W!>wwe`x{+GrFSWhHov7hu?{KuuT%kl#WO@*WX$i_@retlhQBj++SVNCx z5$78LxP>Z=^aJ)D280r_jj=zFfMJFXCIe^B{~V@d1rl_F(qo&AB4bC-vYL>x2jSKX zpuTG-6kgp3e^T&+dtV*i6a~)v@n?n*MffN59y}<0djUX zt27R+SE#hp8bzc#;rk$jw3r4)Q@eI$*`_)=Pvge8@8|8>H3X)<9YX6cXa=ii#Le;(qKm@%0-7$>2ShnYc`j#zJ7gu_FE^?uAkL|H)UIH#gPu^40!6^J=^ zr`}iwa^!4tzW~vOMZAaKF>*8A{^8m$i(VK)>?=#l`xrVe>wseSvM_aF zATNkY>kM_P3?1kE`uIq#mvr-wuTgUH0N<&JhF=(E9%^NS*HLm!4GZ4_XI zL=R5tlG5Mk_1rPfg)sk^llFuKPMPBhuU|L5q#yP_mzxp1o&pAzi-X31sgFpIHn@($ z_>=`AB5(8tP6p2zS5VEvH5J$M` z_much3>S7t3Yo`Yx!>83-hW9LYzDKP?mKdkD#QAK8*M((sx{eBQdrR<^3ZhFP81+& zBnJMUefQyNBji~$5d88Wfw1Lv59aJN9t2!pABLg;ewJ#LXL-10;QcJl+Y4Mtngb)k6JZlCf)3uD_u)J3sYyN;NN5hNbg$%W!i-GK%e&!Us)2IExWSss$YG(hm3kJ-h%yD z>8q^n$+4I(_y_mbT{du4P%h1j3oSpjhY97{+IZ`aA4ug!vNJ6*p?<2H(2w+GD3j$I z1TUXGyNzdf>_yB3grP~FZUs<2Quw;eEi*7s(-MiIkQ%@J^+WGdQvYSUN+TRiD-xto zJ=OUU+kxGYc!HCLNbCvR4lGTp~#L;DFzGd-#gJe*xf(P3hDQz|y)?b9mwU3WUVnpcqXM<@w%r-k*Wr^gzAv)8T^sqA=Ye z!7qy&exJmAcAt~CwS#@yNmjr8*T*!A6w4~E*ibaLRs0CFo(;R3=ODhDt6zWNodmo0 zXx&bT$6&+5c>a|WJ)F4G-^GjY0H#*tY=UNyYr_q5fsrcjk(c^~e*7Lf`!Jd`)p412 zn|^*hV= zFI4UbwA%X@smDd$cQOiMC%jfitTxTb+#`9`G=2rJDfK!E=5ra|So>lc{X1$~w28i+ z4p&cTGwZ#5VueiXS9O8#;RR$yg7tL9!^)Sz&pZYIzlSh}0}V{LxL$Cu%B4U5_}k}- zm~|CsD<076x@<>m=6w6N?WaThIBP`!u{-;WF)xc=2otx*lwf|5+MkdJePjh(B z9SH+%cHGCMAXNxB{_3^otDWdsV7Ob6n{0 z+&!(;iaHOX__5z_$Qk{%xYV%Ig@7iokGBwR`3642ZP#H#v9QGbWl8<|MS*=@qO@Uj z6+SZ_v9`1paUe5tFN~v(b#J3a_Lx0+;r9giZIx-A5TxdbG>xi#AZ5_z1V}B^n)sxT zz49}eK7EWb6wR!6-qQOrHQHkUvshvq%=G2d&@(#XM*Am1;WbnJ{X_!a{ZkphD$^TQ z=Iskb&}=lBm(RHiwJoGg`*NiQ6#RB$T#LF+>#ef;Jne&MxKPX!#r`&TVEFsp2jnNx>dClzpcPy&G&13a_<0qaR3i+k212~hoQ z8nMk{JP-t04I{GW5gUBqcJW-jSMrlw}>p)ptx?WKuCUV77taMiV zHok9V=6yv+Uts@fMY&A}amC=!Yj}eL@=e%XJ#%?agkt1jWF+10{(E9mHLDa>Ll7Vj zG=3cp%ljIB-6pC}6&`xJ*6WCP|IlglLWJ^?yviI8Ve)?V_i4%n;olzny62_`-|IGi z^=}p_O>Z8M;c4|RExu70E7ePW(HWVS&E$+LL6xSQgB`QfMQJ|4pCTFowA39p5P-|$ zUtM_H2HnP8_RoS~Vwk(FhbG zH41licj%=0a;Ln2STFBvU}Ne&O&%8bYKj!h1FA#sNM`232fX|U3QPp#3C?mN2;hE9 z;)!@5ixSPl<89^7gwhHc2YAX1KJK$#*3`KOMIQ253q7-*RJ5k)zp9GBO|Ga~X*^}US5oN@aG&waHV%vi~r{t^`ptTxb zL}q1W8S7*>7oWwvgV4uFLZ(@k`R*=LO_|Gu`prs~!WQXj-NLIa^2(7IHg>BG^N zc|i{-^=&Cek9dkJFQys|sjG9i>LLz|;yCv{^1i%c*h>8zF91kLvS9HBQi~ZU!JL`B zK8N+U0fr1*6??Ium)AF!6tc1eGhXIYL6IRT7rmKp7+>?%5Pa6zC5)KY$ycF0ZJ`G5nEQDG100U-jLkH8^UE4g6wq?sg%pP=-$&G#bcN`^?w3a6 z((s$6eRKcSEIslW-kk5Qi|5Mg-(xdLF}PxxVh$PuO}#aR6pW1kV4Af!Bqh*btXNNZ z>-4(IUl+L4dw+3LcpGut=qB45O+W)Q5?*zZ2A6rJcg`qkSvWA!j^r2mqKuCm6`Py? z@^T#Ux04HemPGd!Hs7NkZdVn1}8_j`o?)*OKZGS!`ff)gF zG?v-lj$wWNWCcw2Mg2o18D~1?3_b0XzdiKBNkYSDpcv@&kp0POmweJE2ZkIQ3B!a! zIgIoE+Xv?;34kyo^QYjZk+tEqZvq^#QG(OzX4~X+KtsoQoddTWUR(yo8R+ObEF1j<-syWOb>)JQ&Zbdu(sctU%Mt zW&YR0{ttY2TTXYZ?~WNU&cES1Z2q(7SrWDh``!J(JM+Nk$!hu&Y;(7E`ZNKTe0w+% zJc?Qnw2B+%UR}0;cB0Rufa(7-3FF}?629@LgTiEC&2uyL6NxexOp?AKT^aAx3gi(W zao>r>MPw0eQ3>IV02uLsC@>yK_epX6GRg4{NEL2wPPF9=*L2RV3yyK8DhuEK>rmmV z`&Q~#c`lgR&93TdOCja|ewOXmPNRh7!&dMT(1ett#iDr8HZW~VqWW@7fe9B6;7S+? zbC`d4@MEau&mKlOPKd>*10q0c{~^baw6!a*w^sY#0Xim{oOsiXiDOhbG&kl3c$$n1 zMRrD83&QucDSEcV*7LIp8VTA@F<%qe+_c`L;6on(>SjAU^}5c9!BCffT>$VQhe=)z z8(=Ej{5>jhmjB3{xDfj2R@VmHQ!CqjlO4KnuOmvHy3K#po$yp_V;p_MKjh1`(rzj6 zHW956k1yvntz{_g?Xbs`avK(IjlTnsu%htO;D7 z?J#x^EzuvVn&NA=!MEj7cwe5A-Z$Zk2LBZH$~%E* zf`((xH0?`}hs|HA%mtwfOEsZJxxrennkTYcwP#FKO5%Lpc^JXhSpV|ZH$Wr;`}`_( zIP==gd3LYyVtwD|*ZJGi{7~x8{=^bGVqu0RJ`n_BZH9+}kz%-4ZRsImi@rx%=ZEKs zcPnUXo6hbJV>fH;@1|bAHIe0ijYI*&kdT|HkDS$9No9 zCHo=*HWb~U+Dtzxr+Esao}6@|;Pf+E$ay0$kQp#s{wlw+7aIKbMdf`OqhoG*;Tco0 zjrP}VQG#Y2cJuqoJg&5({)S(BA}q9T1lGeWRyu=Je|)I!6a+aj!IP^1({)ZYe&x6w zt3a)Dq^TB+A7CdB0-}#z2Ur$W&h3YVw8==!xONy$uQmDWh-@15iEOt!q2m&?ZLA|w z8loSb(0}7y6Xu0?M5Uf4>VZGluB`wMf2oh;m)ghxVda>3m}4%V)r^0nVQ5V6f3>*) z0&VN!N0~GC^P}vj$`EDMZEmVV;N&RISY2C;$0;2(<{Lt&PKzqRByQdiEHGAbwtbS zPj`Da5%U6k1oEtVzI}QNw;!hT6F+~|@=c@$C4NtO@=xgP?|5MyZAyuCzcvq4rdAv@C06%gZ`9%I);R6UGiGJobfux+<0DLS&|MSG4UH z_~o{^^9>ixMg~mY!-@Fai{xaE4^;qy9iZN15Gbn5ZqHWf>Jc5Rv6(#n8`1NcCsdmG zab*dSXVPaE?)wCalD;$ivF%@nB#7D`@YG04p6ed9m}4iJW|pfVMLE<-c{=-8$e?cH zUdU#mCj4gb zZKA^b9p*9S(}8@tw~1RNPHr7tQr;P+-)D8|sq=*o)G%RGqt> zzP5yf`pVxb)I51D_G~Xp^GNK zVI6sAX)a9s)e{8N3?35YA6aQTXuyszK3ah~CemzA&CII#8F&F#KN41~8I^&_%}6MCNb{W87qAF`zj_Y^szhb> z3p3}KbOxotY|(lD=;)`fYE_*{S}x;f^SW#)SU&5X#o|-R|trpa|L5PS5aa0 zTHw8%SDSVtU4?vyrhnq+^@dgFS)|(y{~(4j%3UEiO-rBM9%`)8(dh33pMLiuurNY# z#10AsQ7%*0Cu_DSAU}P;X(JwA64~Q_^R%d_zSm^6Aux?Pn70PM>9EvLeOX z&w9c)pGmcL22;MO3C_B>=NC0RJpMp8?#ZUf=GWRvy z6RHq3B}=MGVg?9@iKFBpsvnkVh3{Vpp=`CcD=u~@ql{my|6?3ssi3mCOPnjI&E}VC zc@X+Yl>;;DNo0W0`0th!X{?luDhOC{E8N=?!w}K1{V=)+1={m(f`Oc|N=07>}3;z{-(A zm{JL=j?Sro5iecmE2-pWlRf(r%|HEQ7kgwQ9+kt=NBhtQI7OwcZ#3%$Uf%^r2nhjY zoQ08MfC%_X{O9~WcirMZMhn#z^ux4Erx-tf-6bHD)9eH&^L>^jvAd^9A^DCDs?0;k zkm7LE*KjP6`2d17MrQaaLqd_Rka}J$csvUec#hw78<=s(hyR>065~YCVCA9+#Q+; za(*L0IEw!r5P|@-;x33L$Lv9 zcuN8YG&g{<(SeJG18~(b!5yywSqQiLAX0;---;}mF5&b4lg|T?LwKREa{9YX_-zL@ZE?Zqi@HxK^2KO1>0LATu{te=T zprmHtY)bDVfxI1S}KBE7V zznP7KQ8HekWU#W6mw`dr-boV}pMQR==&5=Q5T=_q091jfc;R*jX#&=MQ%~@E@9^?`$v48ks<>(fI(F6L(5ppKy|$HWng*bKOb(4|cMUB&z$#ob#XV z5-mg)gmFIybZf=znm3ZPyUO^GJfxt0kmHjaTZ|sthsxXw&}Y)fOUSg=JhRSR^UjZ- zhqqb}Wsyw4zdnj6@#BAJa#-PdI4_dgafFXh85DsEQ_cT+5)XpZq$fZlBA_9UsE9r6 zEFec5?uqN@QhJ^IzwZrwl-5J`CmVPv{(YDTqEqWR^dI;5hXc~cxP%B3v&~s0`Ct89 z@S`i~a^c%V^N81dDT*ItFS*&IN;@O$EgzX0e7x&}TD=!zS}hTpezBLS>mdX(5< z)8DEI(-o_D)c-UX@dA1MuJ*yc>Hf4|`*B2S_O>w*-tbUwtiu`;W(Ud{HTty@(&x(T(F&;M zJ=?H>6`B7nf-90e8V`WSVp|0oEKB-P2M{}4ZDawzvM&a!y>`Y#jCsD%T_l``@ah(I2nJs~Q|%uSKu@k!m~*8B*IoA{*TgtF<(5sHCGG;n@NE%~Xt(G$^&<87u;}Na zx-8cq0g`uA(&RBFo=-4Y1GUZ<``Zw{xL4jfHkZw~%~wvtGueszcXt)_QwH8g!; z%s&3kSa~R$dO$-%L-)c@_hi7&>{6L_M>OZFkUQu;{sL_bUMStNrt{{&O(Wn~*zPOk zB>dnfszb29NSTf2pqIs68k|p-UrSrxgLHqi?3N-UFa!LHy9n1)=s>`yS+J{MEzS@ zNlfGtpma7kG&LR3JE@wB%rFA*h~~KitlO=IP)ZjN6dQLM6qsry zHkB#cyNh#n`)}bCrN1My*;k)^@>e4gJ`LJK?2)Pwp?4Tl4)4FA0(tvY+#1jOUM)xw zlMz4x-f@g^+yKUN`?Vu)|AwujArnM~Pa@y*Q9S8eS(u{-S%(Z5=R~pRl5ZGDjdqH% zC8rW&{##wOpU_oTIG4WXMk4&%2t1;lWcW5&!yxmOT*!hBcKyTqEcNoO+R2;Q?Yj+W z1-Y4?59fijz4(MIDwGe4-baYf08UCs;r|YefD-Md2ST;=cxwpgW=tR76-dQVAhn^= zG9Wk5lQk%jIR@KNU!UMp6@BfU;r+;y4VQ)D2!Il9HX%yW-9nOzV+m$YKzVaO`B8S7t z$!S2Mz`xw>V(RjE`0>bQp<0y&h~Y=M#jpy!#=dE>`=e_AjSZq6u!Dy1xJf~-7|0F! zPR9|n`e_7D2DIV2H(CESQ}hA>U>n|6`%z?YKEA~)BOVY%y=jPV zT=44R!L?J)736X#csn|lfBJ)o8ixaZclguWgrGO<`TN2FMfO}7;5}d+BlK0yTSH3* z4!=;5rOh85&2|x=46hkNaz?)U8&=bcfh=N_#8BNpZ2v$aVBo;sk^*X`v;4-LU;D>! zM*h12MxXIQy)SfAqE4;jY)wgnppazZkdNNVVF;(PLf^qK$FgY9+VFyBKE7UC|f z`R|?&egV11K3s$rJ6!GvoeW=jV*!-e(wA;x(2=d0E_e_%0x--0o8#~m^H1%AH5Z^B zn!TNPn927*bvaf0pt}zhK0o^V@WlGwwKo(*nQ|Q~4_;>~-8y20`HP>@UJa)3nEnGG z5Hwhs|FcmFG16ZVNb5hL`2Gc1{zWIMM{_OiKewV!hCi}U!VuE?s9wU-QbZ!)+Y^tS zGzp5OSi5iq6hmEr$w}&9DFgoB+i*`q`8TBi^MVS{SKEb8Aw%@K7@XCo(De2A`6%mf&a2#~y1N)+kJLD$1HCP!22)(U}xo2|j?WRzt(11j8Z_*v;P$R+Ug*Gy3VxV4K; zGGUGabnW*`Z}~`ydXL-l9e=GC$pY#z|63vy>E*m=$=j}iWP{sRTh0%H54`t>2xYH% zsk+M&u&pNgMCM@3e)Xc?jBWX-TIR_cQ1Z!RW7!B zBjZX=+^3}?SE)B+$EP+0oi1Fp5blDT?*}nsP>filqXH{ms zxU<$hetC`u)Wi+x|EKL-`y^#aQX+sDYIa{M;V%LqLrOk~lR>u0Q!+pyQSU4zY`?E^ z|5@)C)w6G_=i5YYC5SE_u(7hDNYr}uKT|@DSqF%S++lTIbIk^$a>{~0IH8KNFEy%+ zW#$&!ynpgNJh>6uR~?2c)ZMW+h0OKu231(7L_vETPaR+(P)Zy%0~yGm>E9?@@x!Jy z3PYgS}Q@b}x}E#F27@F+j}0=&Ql4gES&f8acMrPAVlVs9$97`FR))R5wI zc&}KFI1UIewh>3PkhnB7u zS3AT8_*|nexznG|Z*DU0c!K@jsI4J)5#DyNi#|e#`l1Vv1`1)*NVcy0LZ``aL0n8B zecupJ(rhq3u8bW0NIRhKYq$v1li+jp*4hfAd&wxYDE8vn1TQ7S@bTM|I2Ob z8vMOIxA7&_j{AKmD+O@EyXT`|dElt0pED^@IV0m)RPBUs*5jW60>>w1!@_G3aBKzG z_f(KfAPBk}-jQtR*Sroq!*3rbQ_m27e+YdzQjUb<_*k8vc_C)y!@cj5E>NxUhPu&g z@Z2<~esU`)ih+4opWe+K7sbN9n*9@n>#@n3*o z?xoROgDuvhq>jJ;Ve{6i<3roQNfgo5^4Q4(|GNExO2Dr7GjgA2zWuKp_K)K0R(6lv z!l$!zW-+T6mb3gQaAFviTQi{|*t%>{(mhTdy+y;Re4qT@kccy#{b z&zWy~kLO@>*WPj2k#H)|7L&gAJ37DmHQAme#@m;(Y8Nu^`D5vf8sZFW#+lA2!HK=( zJ)#hO6JD*`o~&c*&46d}g=Qj@SsoB5ikC z^1V8E+&<-OzuS_C`p5<<(A6fB`LXT(!kV^0_~hL6PpW4={l%|#xgdh?5EIk~lu8{D z2hiyhv3Yxij_#$Wu>P@7SYsl`-~3;}Ktx{34_NL^Kwin&=?!HDv3elQDbcU*qyYpN z(#yw~f1vFGK-t%CC-qa-4FYHbA^h>bag-I&*qaxwn?Qv|idE$<>1H|Gr6JtUu(he2$eg!N z@HTF@dG1)*y;4fxe)4_ZkpaBHH9hXp9p4|gLrRQyuevRd@gSS}JhRnWqrvm|U@>qM z=yl7RQROTKwQtzP3!zUF)_6Ld#NGA6v~2{J9Dd`h6{%+XsU#qGLh%`fB1Hc?wfayK zN`H4BpDp)npVQuu$DVW1qsBS&AJ2eP%6Qw>;k{)Z$8%HL=Q4(a$Ng2_vHw&vA!1L+9zc8vaX2GtqJ{L-;gvF0IR$em zMQ8@{Qp3+3Quk)TJ$?I<8KmwzD*7#(q<@Mc`dchngW}cRG14(Z6K7{T|LhFXwhqUQ;BET;cYqPcAcMgt6M$V9$(?jHo@Sud$an$U&5F zZ1QNh^ztt)E*d#Ij;<43oSKKnd+WNr$_r}+s_O_x6DZSB10*5Q{ourqq>mTl| zx4y^(cy+9;t@R=*j>3_dmm_m)$k$#937V(sllby&5)Xex^UD-|m|q<(jEd#@DV(of zAd7sSdmS*zUDqJ9|K%O2J2OfdUiK{{b{PCy)pi<;hp~7v1CQj&4-10 zgO<3dqhYH1#-Fa}Q{pjql5>>P6gZH21zLfxZ4$SK4T@7b!|`nWF9b*84Bq8&Eht;9 z*P72x&NUCZ7*@B$`FtE=hz5b}S`|c6Ey+j@D1ZibjJaRlR;{cxAWv z?Nqa>QqV*H-*zzaPvpLMHt~nl(x6?vrPpR?zn7~wow?oj*1TKmx4j71>$hvtC$DLD zUrz0^tiP0792U&dxJxNv@r}Elsjn^aSLUu=9#mD{&9n8|ayIL$!H3s>%KEvbchBFW z%cd?VU83mGF#Dar9*s~w&AnmQRQIOvR+uWsuZ?+|a=TzApXO@q^(r%8=}iv#wCnFq z=K9}JbqU@k99Q%j-}NNk+qLCP)jXfmOO|)@?mHcnynd6({mJisP1_}u7k)|eYHXWK z63eQ)E$ufFi!3CWUY2gw%e>omCv}qEX66aH-k&35f9`Q@Us|NPetVqe8=dX*VxJdn ze`q7b=Dn(UA(2sf&g)cOmQFhNJ#<-aMELJZbA#@to>25@kbW<)&!X01 z%NMJt>1ST)tyX)h@?`DxhbgCHr>S4wv}WC&Nw-!{+Z7$2D}74QAcXTvip=M0%Tp_N zor=k`)t|ra^ySr-+(|R9mB(E=`MX#y(wSw)$!iymzB;^c*>%&^*7HxTnRga=soSZT zdDl+9s;r!v8hk6POtzBaig4pRp7eWF(<8gufvNHPu6xs-=e{;mnHzJyGKE+8L0j}; z@%8-e^UCL5HhMiR>sD3Rve&yVZ#{Q1*CO8c+qSr^Z#CN;)(X5>tGG5yUw3<+CfhaL z%bP;hZ?jvgJU67BWyiy74_)6r)_nSxttxn0`0?HE^5(uydHVgP+HE$V?Lv)Leti43 zWA|;f-RqX``95>)^P-fw!Vi{3KNsII-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J w!5uhoe-Jcg1nPN%MiEAtgE$;km@@t6ukO)1^!cY^83Pb_y85}Sb4q9e0FIsP9{>OV literal 0 HcmV?d00001 diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Info.plist b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/pubspec.yaml b/14-automated-testing/projects/challenge/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart b/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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:example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/favicon.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-192.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-512.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-maskable-192.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/icons/Icon-maskable-512.png b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/web/index.html b/14-automated-testing/projects/challenge/packages/component_library/example/web/index.html new file mode 100644 index 00000000..b829dda0 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/web/index.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/web/manifest.json b/14-automated-testing/projects/challenge/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/14-automated-testing/projects/challenge/packages/component_library/example/windows/.gitignore b/14-automated-testing/projects/challenge/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/CMakeLists.txt b/14-automated-testing/projects/challenge/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/Runner.rc b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/main.cpp b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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.CreateAndShow(L"example", 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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/resource.h b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/resources/app_icon.ico b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.cpp b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.h b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/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/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.h b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/exception_indicator.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/exception_indicator.dart index f7d79c2f..9a2259e8 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/lib/src/exception_indicator.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/exception_indicator.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ExceptionIndicator extends StatelessWidget { diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart index c4a9b358..9c334bc7 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'component_library_localizations_en.dart'; +import 'component_library_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ComponentLibraryLocalizations returned /// by `ComponentLibraryLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ComponentLibraryLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @downvoteIconButtonTooltip. /// @@ -144,7 +148,7 @@ abstract class ComponentLibraryLocalizations { /// No description provided for @exceptionIndicatorGenericMessage. /// /// In en, this message translates to: - /// **'The application has encountered an error.\nPlease, check your internet connection and try again later.'** + /// **'There has been an error.\nPlease, check your internet connection and try again later.'** String get exceptionIndicatorGenericMessage; /// No description provided for @genericErrorSnackbarMessage. @@ -167,23 +171,25 @@ class _ComponentLibraryLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupComponentLibraryLocalizations(locale)); + lookupComponentLibraryLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ComponentLibraryLocalizationsDelegate old) => false; } -ComponentLibraryLocalizations _lookupComponentLibraryLocalizations( +ComponentLibraryLocalizations lookupComponentLibraryLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ComponentLibraryLocalizationsEn(); + case 'pt': + return ComponentLibraryLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart index 6bc7ade3..bb2968c0 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_en.dart @@ -30,7 +30,7 @@ class ComponentLibraryLocalizationsEn extends ComponentLibraryLocalizations { @override String get exceptionIndicatorGenericMessage => - 'The application has encountered an error.\nPlease, check your internet connection and try again later.'; + 'There has been an error.\nPlease, check your internet connection and try again later.'; @override String get genericErrorSnackbarMessage => diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart new file mode 100644 index 00000000..ef10323b --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/component_library_localizations_pt.dart @@ -0,0 +1,42 @@ +import 'component_library_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ComponentLibraryLocalizationsPt extends ComponentLibraryLocalizations { + ComponentLibraryLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get downvoteIconButtonTooltip => 'Negativo'; + + @override + String get upvoteIconButtonTooltip => 'Positivo'; + + @override + String get searchBarHintText => 'jornada'; + + @override + String get searchBarLabelText => 'Pesquisar'; + + @override + String get shareIconButtonTooltip => 'Compartilhar'; + + @override + String get favoriteIconButtonTooltip => 'Favoritar'; + + @override + String get exceptionIndicatorGenericTitle => 'Algo deu errado'; + + @override + String get exceptionIndicatorTryAgainButton => 'Tentar Novamente'; + + @override + String get exceptionIndicatorGenericMessage => + 'Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get genericErrorSnackbarMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; + + @override + String get authenticationRequiredErrorSnackbarMessage => + 'Você precisa estar logado para executar essa ação.'; +} diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c359d2b5 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/l10n/messages_pt.arb @@ -0,0 +1,13 @@ +{ + "downvoteIconButtonTooltip": "Negativo", + "upvoteIconButtonTooltip": "Positivo", + "searchBarHintText": "jornada", + "searchBarLabelText": "Pesquisar", + "shareIconButtonTooltip": "Compartilhar", + "favoriteIconButtonTooltip": "Favoritar", + "exceptionIndicatorGenericTitle": "Algo deu errado", + "exceptionIndicatorTryAgainButton": "Tentar Novamente", + "exceptionIndicatorGenericMessage": "Ocorreu um erro.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "genericErrorSnackbarMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet.", + "authenticationRequiredErrorSnackbarMessage": "Você precisa estar logado para executar essa ação." +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/quote_card.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/quote_card.dart index 0975e7d0..5428cb36 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/lib/src/quote_card.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/quote_card.dart @@ -1,5 +1,4 @@ import 'package:component_library/component_library.dart'; -import 'package:component_library/src/theme/spacing.dart'; import 'package:flutter/material.dart'; class QuoteCard extends StatelessWidget { diff --git a/14-automated-testing/projects/challenge/packages/component_library/lib/src/search_bar.dart b/14-automated-testing/projects/challenge/packages/component_library/lib/src/search_bar.dart index 151a4ac8..dc10a28d 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/lib/src/search_bar.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/lib/src/search_bar.dart @@ -1,6 +1,5 @@ import 'package:component_library/component_library.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; class SearchBar extends StatelessWidget { const SearchBar({ diff --git a/14-automated-testing/projects/challenge/packages/component_library/pubspec.yaml b/14-automated-testing/projects/challenge/packages/component_library/pubspec.yaml index 2575ccb5..d75f7082 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/component_library/pubspec.yaml @@ -10,15 +10,15 @@ dependencies: flutter_localizations: sdk: flutter intl: ^0.17.0 - flutter_svg: ^1.1.1+1 + flutter_svg: ^0.22.0 auto_size_text: ^3.0.0-nullsafety.0 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart index 71183977..5a412256 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,6 +5,22 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { + testWidgets( + 'FavoriteIconButton uses outlined favorite icon when is not favorite', + (tester) async { + await tester.pumpWidget(const MaterialApp( + locale: Locale('en'), + localizationsDelegates: [ComponentLibraryLocalizations.delegate], + home: Scaffold( + body: FavoriteIconButton( + isFavorite: false, + )), + )); + + final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); + expect(outlinedIconFinder, findsOneWidget); + }); + testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; @@ -25,20 +41,5 @@ void main() { expect(value, true); }); - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); }); } diff --git a/14-automated-testing/projects/challenge/packages/domain_models/pubspec.yaml b/14-automated-testing/projects/challenge/packages/domain_models/pubspec.yaml index d50211d8..b09f3aa3 100644 --- a/14-automated-testing/projects/challenge/packages/domain_models/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/domain_models/pubspec.yaml @@ -8,5 +8,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart b/14-automated-testing/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart index 3681556c..7d81ca3a 100644 --- a/14-automated-testing/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart +++ b/14-automated-testing/projects/challenge/packages/fav_qs_api/lib/src/fav_qs_api.dart @@ -1,13 +1,9 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; -import 'package:fav_qs_api/src/models/request/password_reset_email_request_rm.dart'; -import 'package:fav_qs_api/src/models/request/user_email_rm.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:meta/meta.dart'; -import 'models/models.dart'; - typedef UserTokenSupplier = Future Function(); class FavQsApi { diff --git a/14-automated-testing/projects/challenge/packages/fav_qs_api/pubspec.yaml b/14-automated-testing/projects/challenge/packages/fav_qs_api/pubspec.yaml index cb7bdab0..b8f9e302 100644 --- a/14-automated-testing/projects/challenge/packages/fav_qs_api/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/fav_qs_api/pubspec.yaml @@ -15,4 +15,4 @@ dev_dependencies: build_runner: ^2.0.5 json_serializable: ^6.2.0 test: ^1.21.2 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart index f4d70e95..086bd15b 100644 --- a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'forgot_my_password_localizations_en.dart'; +import 'forgot_my_password_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ForgotMyPasswordLocalizations returned /// by `ForgotMyPasswordLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ForgotMyPasswordLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @dialogTitle. /// @@ -149,23 +153,25 @@ class _ForgotMyPasswordLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupForgotMyPasswordLocalizations(locale)); + lookupForgotMyPasswordLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ForgotMyPasswordLocalizationsDelegate old) => false; } -ForgotMyPasswordLocalizations _lookupForgotMyPasswordLocalizations( +ForgotMyPasswordLocalizations lookupForgotMyPasswordLocalizations( Locale locale) { -// Lookup logic when only language code is specified. + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return ForgotMyPasswordLocalizationsEn(); + case 'pt': + return ForgotMyPasswordLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart new file mode 100644 index 00000000..1043529e --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/forgot_my_password_localizations_pt.dart @@ -0,0 +1,32 @@ +import 'forgot_my_password_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ForgotMyPasswordLocalizationsPt extends ForgotMyPasswordLocalizations { + ForgotMyPasswordLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get dialogTitle => 'Esqueci Minha Senha'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailRequestSuccessMessage => + 'Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.'; + + @override + String get confirmButtonLabel => 'Confirmar'; + + @override + String get cancelButtonLabel => 'Cancelar'; + + @override + String get errorMessage => + 'Ocorreu um erro. Por favor, confira sua conexão com a internet.'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..c7ea3391 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/lib/src/l10n/messages_pt.arb @@ -0,0 +1,10 @@ +{ + "dialogTitle": "Esqueci Minha Senha", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailRequestSuccessMessage": "Se este email estiver registrado em nossos servidores, um link será enviado para você com instruções sobre como resetar sua senha.", + "confirmButtonLabel": "Confirmar", + "cancelButtonLabel": "Cancelar", + "errorMessage": "Ocorreu um erro. Por favor, confira sua conexão com a internet." +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/pubspec.yaml index 5395f45c..fc6d79ab 100644 --- a/14-automated-testing/projects/challenge/packages/features/forgot_my_password/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/forgot_my_password/pubspec.yaml @@ -18,9 +18,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart index 57c37f4e..0663f685 100644 --- a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/dark_mode_preference_picker.dart @@ -1,9 +1,4 @@ -import 'package:component_library/component_library.dart'; -import 'package:domain_models/domain_models.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/profile_menu_bloc.dart'; +part of './profile_menu_screen.dart'; class DarkModePreferencePicker extends StatelessWidget { const DarkModePreferencePicker({ diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..0972ae86 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "signInButtonLabel": "Entrar", + "signedInUserGreeting": "Olá, {username}!", + "@signedInUserGreeting": { + "placeholders": { + "username": { + "type": "String" + } + } + }, + "updateProfileTileLabel": "Atualizar Perfil", + "darkModePreferencesHeaderTileLabel": "Configurações de Modo Noturno", + "darkModePreferencesAlwaysDarkTileLabel": "Sempre Escuro", + "darkModePreferencesAlwaysLightTileLabel": "Sempre Claro", + "darkModePreferencesUseSystemSettingsTileLabel": "De Acordo com o Sistema", + "signOutButtonLabel": "Sair", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart index dac7abf9..71f77a0c 100644 --- a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'profile_menu_localizations_en.dart'; +import 'profile_menu_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of ProfileMenuLocalizations returned /// by `ProfileMenuLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class ProfileMenuLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @signInButtonLabel. /// @@ -166,7 +170,7 @@ class _ProfileMenuLocalizationsDelegate @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_ProfileMenuLocalizationsDelegate old) => false; @@ -177,6 +181,8 @@ ProfileMenuLocalizations lookupProfileMenuLocalizations(Locale locale) { switch (locale.languageCode) { case 'en': return ProfileMenuLocalizationsEn(); + case 'pt': + return ProfileMenuLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart new file mode 100644 index 00000000..67d75e71 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/l10n/profile_menu_localizations_pt.dart @@ -0,0 +1,40 @@ +import 'profile_menu_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class ProfileMenuLocalizationsPt extends ProfileMenuLocalizations { + ProfileMenuLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String signedInUserGreeting(String username) { + return 'Olá, $username!'; + } + + @override + String get updateProfileTileLabel => 'Atualizar Perfil'; + + @override + String get darkModePreferencesHeaderTileLabel => + 'Configurações de Modo Noturno'; + + @override + String get darkModePreferencesAlwaysDarkTileLabel => 'Sempre Escuro'; + + @override + String get darkModePreferencesAlwaysLightTileLabel => 'Sempre Claro'; + + @override + String get darkModePreferencesUseSystemSettingsTileLabel => + 'De Acordo com o Sistema'; + + @override + String get signOutButtonLabel => 'Sair'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart index 2202ce36..e3017b85 100644 --- a/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/lib/src/profile_menu_screen.dart @@ -1,12 +1,14 @@ import 'package:component_library/component_library.dart'; +import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:profile_menu/profile_menu.dart'; -import 'package:profile_menu/src/dark_mode_preference_picker.dart'; import 'package:profile_menu/src/profile_menu_bloc.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; +part './dark_mode_preference_picker.dart'; + class ProfileMenuScreen extends StatelessWidget { const ProfileMenuScreen({ required this.userRepository, diff --git a/14-automated-testing/projects/challenge/packages/features/profile_menu/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/profile_menu/pubspec.yaml index 95eb1f48..8f33a7c1 100644 --- a/14-automated-testing/projects/challenge/packages/features/profile_menu/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/profile_menu/pubspec.yaml @@ -24,9 +24,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/l10n.yaml b/14-automated-testing/projects/challenge/packages/features/quote_details/l10n.yaml deleted file mode 100644 index 867ea9dd..00000000 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/l10n.yaml +++ /dev/null @@ -1,6 +0,0 @@ -arb-dir: lib/src/l10n -template-arb-file: messages_en.arb -output-localization-file: quote_details_localizations.dart -output-class: QuoteDetailsLocalizations -synthetic-package: false -nullable-getter: false \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/quote_details.dart b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/quote_details.dart index 3bc917fc..5b017945 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/quote_details.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/quote_details.dart @@ -1,2 +1 @@ -export 'src/l10n/quote_details_localizations.dart'; export 'src/quote_details_screen.dart'; diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb deleted file mode 100644 index 4c2cd29d..00000000 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/messages_en.arb +++ /dev/null @@ -1,10 +0,0 @@ -{ - "shareQuoteText": "Hey, take a look at this quote I just found on Wonder Words: {link}", - "@shareQuoteText": { - "placeholders": { - "link": { - "type": "String" - } - } - } -} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart deleted file mode 100644 index ef2c79ef..00000000 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'quote_details_localizations_en.dart'; - -/// Callers can lookup localized strings with an instance of QuoteDetailsLocalizations returned -/// by `QuoteDetailsLocalizations.of(context)`. -/// -/// Applications need to include `QuoteDetailsLocalizations.delegate()` in their app's -/// localizationDelegates list, and the locales they support in the app's -/// supportedLocales list. For example: -/// -/// ``` -/// import 'l10n/quote_details_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: QuoteDetailsLocalizations.localizationsDelegates, -/// supportedLocales: QuoteDetailsLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ``` -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the QuoteDetailsLocalizations.supportedLocales -/// property. -abstract class QuoteDetailsLocalizations { - QuoteDetailsLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static QuoteDetailsLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteDetailsLocalizations)!; - } - - static const LocalizationsDelegate delegate = - _QuoteDetailsLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; - - /// No description provided for @shareQuoteText. - /// - /// In en, this message translates to: - /// **'Hey, take a look at this quote I just found on Wonder Words: {link}'** - String shareQuoteText(String link); -} - -class _QuoteDetailsLocalizationsDelegate - extends LocalizationsDelegate { - const _QuoteDetailsLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteDetailsLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); - - @override - bool shouldReload(_QuoteDetailsLocalizationsDelegate old) => false; -} - -QuoteDetailsLocalizations _lookupQuoteDetailsLocalizations(Locale locale) { -// Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'en': - return QuoteDetailsLocalizationsEn(); - } - - throw FlutterError( - 'QuoteDetailsLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart deleted file mode 100644 index be8c43fd..00000000 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/l10n/quote_details_localizations_en.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'quote_details_localizations.dart'; - -/// The translations for English (`en`). -class QuoteDetailsLocalizationsEn extends QuoteDetailsLocalizations { - QuoteDetailsLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String shareQuoteText(String link) { - return 'Hey, take a look at this quote I just found on Wonder Words: $link'; - } -} diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart index 5069e464..c4242afc 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_details/lib/src/quote_details_screen.dart @@ -2,7 +2,6 @@ import 'package:component_library/component_library.dart'; import 'package:domain_models/domain_models.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:quote_details/quote_details.dart'; import 'package:quote_details/src/quote_details_cubit.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:share_plus/share_plus.dart'; @@ -16,14 +15,14 @@ class QuoteDetailsScreen extends StatelessWidget { required this.quoteId, required this.onAuthenticationError, required this.quoteRepository, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final int quoteId; final VoidCallback onAuthenticationError; final QuoteRepository quoteRepository; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -44,12 +43,12 @@ class QuoteDetailsScreen extends StatelessWidget { class QuoteDetailsView extends StatelessWidget { const QuoteDetailsView({ required this.onAuthenticationError, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final VoidCallback onAuthenticationError; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { @@ -119,16 +118,17 @@ class _QuoteActionsAppBar extends StatelessWidget implements PreferredSizeWidget { const _QuoteActionsAppBar({ required this.quote, - required this.shareableLinkGenerator, + this.shareableLinkGenerator, Key? key, }) : super(key: key); final Quote quote; - final QuoteDetailsShareableLinkGenerator shareableLinkGenerator; + final QuoteDetailsShareableLinkGenerator? shareableLinkGenerator; @override Widget build(BuildContext context) { final cubit = context.read(); + final shareableLinkGenerator = this.shareableLinkGenerator; return RowAppBar( children: [ FavoriteIconButton( @@ -163,16 +163,15 @@ class _QuoteActionsAppBar extends StatelessWidget } }, ), - ShareIconButton( - onTap: () async { - final url = await shareableLinkGenerator(quote); - Share.share( - QuoteDetailsLocalizations.of(context).shareQuoteText( + if (shareableLinkGenerator != null) + ShareIconButton( + onTap: () async { + final url = await shareableLinkGenerator(quote); + Share.share( url, - ), - ); - }, - ), + ); + }, + ), ], ); } diff --git a/14-automated-testing/projects/challenge/packages/features/quote_details/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/quote_details/pubspec.yaml index cf7a6214..5f16c003 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_details/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/quote_details/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart index 6128a04b..ca4f7515 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/filter_horizontal_list.dart @@ -53,8 +53,9 @@ class _FavoritesChip extends StatelessWidget { return isFilteringByFavorites; }, builder: (context, isFavoritesOnly) { + final l10n = QuoteListLocalizations.of(context); return RoundedChoiceChip( - label: 'Favorites', + label: l10n.favoritesTagLabel, avatar: Icon( isFavoritesOnly ? Icons.favorite : Icons.favorite_border_outlined, color: isFavoritesOnly diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb index 652e7bf1..61f6a492 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_en.arb @@ -1,5 +1,6 @@ { "quoteListRefreshErrorMessage": "We couldn't refresh your items.\nPlease, check your internet connection and try again later.", + "favoritesTagLabel": "Favorites", "lifeTagLabel": "Life", "happinessTagLabel": "Happiness", "workTagLabel": "Work", diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..95d9446b --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/messages_pt.arb @@ -0,0 +1,11 @@ +{ + "quoteListRefreshErrorMessage": "Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.", + "favoritesTagLabel": "Favoritos", + "lifeTagLabel": "Vida", + "happinessTagLabel": "Felicidade", + "workTagLabel": "Trabalho", + "natureTagLabel": "Natureza", + "scienceTagLabel": "Ciência", + "loveTagLabel": "Amor", + "funnyTagLabel": "Engraçadas" +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart index 1dc2d271..2c7c3736 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations.dart @@ -1,3 +1,4 @@ + import 'dart:async'; import 'package:flutter/foundation.dart'; @@ -6,6 +7,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'quote_list_localizations_en.dart'; +import 'quote_list_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of QuoteListLocalizations returned /// by `QuoteListLocalizations.of(context)`. @@ -59,18 +61,15 @@ import 'quote_list_localizations_en.dart'; /// be consistent with the languages listed in the QuoteListLocalizations.supportedLocales /// property. abstract class QuoteListLocalizations { - QuoteListLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + QuoteListLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); final String localeName; static QuoteListLocalizations of(BuildContext context) { - return Localizations.of( - context, QuoteListLocalizations)!; + return Localizations.of(context, QuoteListLocalizations)!; } - static const LocalizationsDelegate delegate = - _QuoteListLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _QuoteListLocalizationsDelegate(); /// A list of this localizations delegate along with the default localizations /// delegates. @@ -82,8 +81,7 @@ abstract class QuoteListLocalizations { /// Additional delegates can be added by appending to this list in /// MaterialApp. This list does not have to be used at all if a custom list /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ + static const List> localizationsDelegates = >[ delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, @@ -91,7 +89,10 @@ abstract class QuoteListLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @quoteListRefreshErrorMessage. /// @@ -99,6 +100,12 @@ abstract class QuoteListLocalizations { /// **'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'** String get quoteListRefreshErrorMessage; + /// No description provided for @favoritesTagLabel. + /// + /// In en, this message translates to: + /// **'Favorites'** + String get favoritesTagLabel; + /// No description provided for @lifeTagLabel. /// /// In en, this message translates to: @@ -142,34 +149,34 @@ abstract class QuoteListLocalizations { String get funnyTagLabel; } -class _QuoteListLocalizationsDelegate - extends LocalizationsDelegate { +class _QuoteListLocalizationsDelegate extends LocalizationsDelegate { const _QuoteListLocalizationsDelegate(); @override Future load(Locale locale) { - return SynchronousFuture( - _lookupQuoteListLocalizations(locale)); + return SynchronousFuture(lookupQuoteListLocalizations(locale)); } @override - bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + bool isSupported(Locale locale) => ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_QuoteListLocalizationsDelegate old) => false; } -QuoteListLocalizations _lookupQuoteListLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +QuoteListLocalizations lookupQuoteListLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. switch (locale.languageCode) { - case 'en': - return QuoteListLocalizationsEn(); + case 'en': return QuoteListLocalizationsEn(); + case 'pt': return QuoteListLocalizationsPt(); } throw FlutterError( - 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); + 'QuoteListLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); } diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart index 7e2619b9..f5e396e7 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_en.dart @@ -1,3 +1,6 @@ + + + import 'quote_list_localizations.dart'; /// The translations for English (`en`). @@ -5,8 +8,10 @@ class QuoteListLocalizationsEn extends QuoteListLocalizations { QuoteListLocalizationsEn([String locale = 'en']) : super(locale); @override - String get quoteListRefreshErrorMessage => - 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + String get quoteListRefreshErrorMessage => 'We couldn\'t refresh your items.\nPlease, check your internet connection and try again later.'; + + @override + String get favoritesTagLabel => 'Favorites'; @override String get lifeTagLabel => 'Life'; diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart new file mode 100644 index 00000000..31101779 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/l10n/quote_list_localizations_pt.dart @@ -0,0 +1,36 @@ + + + +import 'quote_list_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class QuoteListLocalizationsPt extends QuoteListLocalizations { + QuoteListLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get quoteListRefreshErrorMessage => 'Não conseguimos atualizar seus itens.\nPor favor, confira sua conexão com a internet e tente novamente mais tarde.'; + + @override + String get favoritesTagLabel => 'Favoritos'; + + @override + String get lifeTagLabel => 'Vida'; + + @override + String get happinessTagLabel => 'Felicidade'; + + @override + String get workTagLabel => 'Trabalho'; + + @override + String get natureTagLabel => 'Natureza'; + + @override + String get scienceTagLabel => 'Ciência'; + + @override + String get loveTagLabel => 'Amor'; + + @override + String get funnyTagLabel => 'Engraçadas'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart index 640d27f2..2ccb5ec1 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_bloc.dart @@ -345,8 +345,9 @@ class QuoteListBloc extends Bloc { await for (final newPage in pagesStream) { final newItemList = newPage.quoteList; final oldItemList = state.itemList ?? []; - final completeItemList = - isRefresh ? newItemList : (oldItemList + newItemList); + final completeItemList = isRefresh || page == 1 + ? newItemList + : (oldItemList + newItemList); final nextPage = newPage.isLastPage ? null : page + 1; diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart index 88ab8d16..0d4e77a5 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -7,8 +7,8 @@ import 'package:monitoring/monitoring.dart'; import 'package:quote_list/src/filter_horizontal_list.dart'; import 'package:quote_list/src/l10n/quote_list_localizations.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -import 'package:quote_list/src/quote_sliver_grid.dart'; -import 'package:quote_list/src/quote_sliver_list.dart'; +import 'package:quote_list/src/quote_paged_grid_view.dart'; +import 'package:quote_list/src/quote_paged_list_view.dart'; import 'package:quote_repository/quote_repository.dart'; import 'package:user_repository/user_repository.dart'; @@ -138,44 +138,42 @@ class _QuoteListViewState extends State { child: Scaffold( body: GestureDetector( onTap: () => _releaseFocus(context), - child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - child: CustomScrollView( - slivers: [ - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: theme.screenMargin, - ), - child: SearchBar( - controller: _searchBarController, - ), - ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: theme.screenMargin, ), - const SliverToBoxAdapter( - child: FilterHorizontalList(), + child: SearchBar( + controller: _searchBarController, ), - widget.remoteValueService.isGridQuotesViewEnabled - ? QuoteSliverGrid( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ) - : QuoteSliverList( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - ), - ], - ), + ), + const FilterHorizontalList(), + Expanded( + child: RefreshIndicator( + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + child: widget.remoteValueService.isGridQuotesViewEnabled + ? QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ) + : QuotePagedListView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), + ), + ], ), ), ), diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart similarity index 92% rename from 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart rename to 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart index d19db77d..5fe4581d 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_grid.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_grid_view.dart @@ -6,10 +6,10 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverGrid extends StatelessWidget { +class QuotePagedGridView extends StatelessWidget { static const _gridColumnCount = 2; - const QuoteSliverGrid({ + const QuotePagedGridView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -24,12 +24,12 @@ class QuoteSliverGrid extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), // For a deep dive on how the pagination works, refer to: https://www.raywenderlich.com/14214369-infinite-scrolling-pagination-in-flutter - sliver: PagedStaggeredSliverGrid.count( + child: PagedMasonryGridView.count( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { @@ -76,9 +76,6 @@ class QuoteSliverGrid extends StatelessWidget { crossAxisCount: _gridColumnCount, crossAxisSpacing: theme.gridSpacing, mainAxisSpacing: theme.gridSpacing, - staggeredTileBuilder: (_) => const StaggeredTile.fit( - 1, - ), ), ); } diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_list.dart b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart similarity index 94% rename from 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_list.dart rename to 14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart index 0fa8e548..be337863 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_sliver_list.dart +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/lib/src/quote_paged_list_view.dart @@ -6,8 +6,8 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:quote_list/quote_list.dart'; import 'package:quote_list/src/quote_list_bloc.dart'; -class QuoteSliverList extends StatelessWidget { - const QuoteSliverList({ +class QuotePagedListView extends StatelessWidget { + const QuotePagedListView({ required this.pagingController, this.onQuoteSelected, Key? key, @@ -22,11 +22,11 @@ class QuoteSliverList extends StatelessWidget { final onQuoteSelected = this.onQuoteSelected; final bloc = context.read(); - return SliverPadding( + return Padding( padding: EdgeInsets.symmetric( horizontal: theme.screenMargin, ), - sliver: PagedSliverList.separated( + child: PagedListView.separated( pagingController: pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, quote, index) { diff --git a/14-automated-testing/projects/challenge/packages/features/quote_list/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/quote_list/pubspec.yaml index 9ee3767d..7eef55f0 100644 --- a/14-automated-testing/projects/challenge/packages/features/quote_list/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/quote_list/pubspec.yaml @@ -20,18 +20,15 @@ dependencies: path: ../../user_repository monitoring: path: ../../monitoring - infinite_scroll_pagination: - git: - url: https://github.com/EdsonBueno/infinite_scroll_pagination.git - ref: develop + infinite_scroll_pagination: ^4.0.0-dev.1 rxdart: ^0.27.3 dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..f2be4418 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/messages_pt.arb @@ -0,0 +1,14 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Entrar", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "forgotMyPasswordButtonLabel": "Esqueci minha senha", + "signInButtonLabel": "Entrar", + "signUpOpeningText": "Não tem uma conta?", + "signUpButtonLabel": "Cadastrar" +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart index 6a7ad45a..282022e0 100644 --- a/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_in_localizations_en.dart'; +import 'sign_in_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignInLocalizations returned /// by `SignInLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignInLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -172,22 +176,24 @@ class _SignInLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignInLocalizations(locale)); + lookupSignInLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignInLocalizationsDelegate old) => false; } -SignInLocalizations _lookupSignInLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignInLocalizations lookupSignInLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignInLocalizationsEn(); + case 'pt': + return SignInLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart new file mode 100644 index 00000000..ec3f7089 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/sign_in/lib/src/l10n/sign_in_localizations_pt.dart @@ -0,0 +1,44 @@ +import 'sign_in_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignInLocalizationsPt extends SignInLocalizations { + SignInLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Entrar'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get forgotMyPasswordButtonLabel => 'Esqueci minha senha'; + + @override + String get signInButtonLabel => 'Entrar'; + + @override + String get signUpOpeningText => 'Não tem uma conta?'; + + @override + String get signUpButtonLabel => 'Cadastrar'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/sign_in/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/sign_in/pubspec.yaml index 0464dbe4..9f15389f 100644 --- a/14-automated-testing/projects/challenge/packages/features/sign_in/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/sign_in/pubspec.yaml @@ -23,7 +23,7 @@ dev_dependencies: bloc_test: ^9.0.3 mockito: ^5.2.0 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart b/14-automated-testing/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart index e7b9faa5..7f7c74cc 100644 --- a/14-automated-testing/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart +++ b/14-automated-testing/projects/challenge/packages/features/sign_in/test/sign_in_cubit_test.dart @@ -11,8 +11,8 @@ void main() { 'Emits SignInState with unvalidated email when email is changed for the first time', build: () => SignInCubit(userRepository: MockUserRepository()), act: (cubit) => cubit.onEmailChanged('email@gmail.com'), - expect: () => [ - const SignInState( + expect: () => const [ + SignInState( email: Email.unvalidated( 'email@gmail.com', )) diff --git a/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..8dd641c7 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/messages_pt.arb @@ -0,0 +1,19 @@ +{ + "invalidCredentialsErrorMessage": "Email e/ou senha inválida.", + "appBarTitle": "Cadastro", + "signUpButtonLabel": "Cadastrar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Senha", + "passwordTextFieldEmptyErrorMessage": "Sua senha não pode ser vazia.", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação de Senha", + "passwordConfirmationTextFieldEmptyErrorMessage": "Não pode ser vazia.", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart index 2ea03681..67c590b4 100644 --- a/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'sign_up_localizations_en.dart'; +import 'sign_up_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of SignUpLocalizations returned /// by `SignUpLocalizations.of(context)`. @@ -90,7 +91,10 @@ abstract class SignUpLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @invalidCredentialsErrorMessage. /// @@ -202,22 +206,24 @@ class _SignUpLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupSignUpLocalizations(locale)); + lookupSignUpLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_SignUpLocalizationsDelegate old) => false; } -SignUpLocalizations _lookupSignUpLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +SignUpLocalizations lookupSignUpLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return SignUpLocalizationsEn(); + case 'pt': + return SignUpLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart new file mode 100644 index 00000000..95f37b12 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/sign_up/lib/src/l10n/sign_up_localizations_pt.dart @@ -0,0 +1,65 @@ +import 'sign_up_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class SignUpLocalizationsPt extends SignUpLocalizations { + SignUpLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get invalidCredentialsErrorMessage => 'Email e/ou senha inválida.'; + + @override + String get appBarTitle => 'Cadastro'; + + @override + String get signUpButtonLabel => 'Cadastrar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Esse usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Esse email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Esse email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Senha'; + + @override + String get passwordTextFieldEmptyErrorMessage => + 'Sua senha não pode ser vazia.'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação de Senha'; + + @override + String get passwordConfirmationTextFieldEmptyErrorMessage => + 'Não pode ser vazia.'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/sign_up/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/sign_up/pubspec.yaml index 64c8a099..bf170f01 100644 --- a/14-automated-testing/projects/challenge/packages/features/sign_up/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/sign_up/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: uses-material-design: true \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb new file mode 100644 index 00000000..483c2d90 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/messages_pt.arb @@ -0,0 +1,16 @@ +{ + "appBarTitle": "Atualizar Perfil", + "updateProfileButtonLabel": "Atualizar", + "usernameTextFieldLabel": "Usuário", + "usernameTextFieldEmptyErrorMessage": "Seu usuário não pode ser vazio.", + "usernameTextFieldInvalidErrorMessage": "Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).", + "usernameTextFieldAlreadyTakenErrorMessage": "Este usuário já está cadastrado.", + "emailTextFieldLabel": "Email", + "emailTextFieldEmptyErrorMessage": "Seu email não pode ser vazio.", + "emailTextFieldInvalidErrorMessage": "Este email não é válido.", + "emailTextFieldAlreadyRegisteredErrorMessage": "Este email já está cadastrado.", + "passwordTextFieldLabel": "Nova Senha", + "passwordTextFieldInvalidErrorMessage": "Sua senha precisa ter pelo menos cinco caracteres.", + "passwordConfirmationTextFieldLabel": "Confirmação da Nova Senha", + "passwordConfirmationTextFieldInvalidErrorMessage": "Suas senhas precisam ser iguais." +} \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart index a92fba7e..f1370593 100644 --- a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart +++ b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations.dart @@ -6,6 +6,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart' as intl; import 'update_profile_localizations_en.dart'; +import 'update_profile_localizations_pt.dart'; /// Callers can lookup localized strings with an instance of UpdateProfileLocalizations returned /// by `UpdateProfileLocalizations.of(context)`. @@ -91,7 +92,10 @@ abstract class UpdateProfileLocalizations { ]; /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [Locale('en')]; + static const List supportedLocales = [ + Locale('en'), + Locale('pt') + ]; /// No description provided for @appBarTitle. /// @@ -156,7 +160,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordTextFieldLabel. /// /// In en, this message translates to: - /// **'Password'** + /// **'New Password'** String get passwordTextFieldLabel; /// No description provided for @passwordTextFieldInvalidErrorMessage. @@ -168,7 +172,7 @@ abstract class UpdateProfileLocalizations { /// No description provided for @passwordConfirmationTextFieldLabel. /// /// In en, this message translates to: - /// **'Password Confirmation'** + /// **'New Password Confirmation'** String get passwordConfirmationTextFieldLabel; /// No description provided for @passwordConfirmationTextFieldInvalidErrorMessage. @@ -185,22 +189,24 @@ class _UpdateProfileLocalizationsDelegate @override Future load(Locale locale) { return SynchronousFuture( - _lookupUpdateProfileLocalizations(locale)); + lookupUpdateProfileLocalizations(locale)); } @override bool isSupported(Locale locale) => - ['en'].contains(locale.languageCode); + ['en', 'pt'].contains(locale.languageCode); @override bool shouldReload(_UpdateProfileLocalizationsDelegate old) => false; } -UpdateProfileLocalizations _lookupUpdateProfileLocalizations(Locale locale) { -// Lookup logic when only language code is specified. +UpdateProfileLocalizations lookupUpdateProfileLocalizations(Locale locale) { + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': return UpdateProfileLocalizationsEn(); + case 'pt': + return UpdateProfileLocalizationsPt(); } throw FlutterError( diff --git a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart index 3c8eac4d..25fd4482 100644 --- a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart +++ b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_en.dart @@ -39,14 +39,14 @@ class UpdateProfileLocalizationsEn extends UpdateProfileLocalizations { 'This email is already registered.'; @override - String get passwordTextFieldLabel => 'Password'; + String get passwordTextFieldLabel => 'New Password'; @override String get passwordTextFieldInvalidErrorMessage => 'Password must be at least five characters long.'; @override - String get passwordConfirmationTextFieldLabel => 'Password Confirmation'; + String get passwordConfirmationTextFieldLabel => 'New Password Confirmation'; @override String get passwordConfirmationTextFieldInvalidErrorMessage => diff --git a/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart new file mode 100644 index 00000000..bc4eb584 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/features/update_profile/lib/src/l10n/update_profile_localizations_pt.dart @@ -0,0 +1,54 @@ +import 'update_profile_localizations.dart'; + +/// The translations for Portuguese (`pt`). +class UpdateProfileLocalizationsPt extends UpdateProfileLocalizations { + UpdateProfileLocalizationsPt([String locale = 'pt']) : super(locale); + + @override + String get appBarTitle => 'Atualizar Perfil'; + + @override + String get updateProfileButtonLabel => 'Atualizar'; + + @override + String get usernameTextFieldLabel => 'Usuário'; + + @override + String get usernameTextFieldEmptyErrorMessage => + 'Seu usuário não pode ser vazio.'; + + @override + String get usernameTextFieldInvalidErrorMessage => + 'Seu usuário precisa ter entre 1 e 20 caracteres e pode conter apenas letras, números, e underline (_).'; + + @override + String get usernameTextFieldAlreadyTakenErrorMessage => + 'Este usuário já está cadastrado.'; + + @override + String get emailTextFieldLabel => 'Email'; + + @override + String get emailTextFieldEmptyErrorMessage => 'Seu email não pode ser vazio.'; + + @override + String get emailTextFieldInvalidErrorMessage => 'Este email não é válido.'; + + @override + String get emailTextFieldAlreadyRegisteredErrorMessage => + 'Este email já está cadastrado.'; + + @override + String get passwordTextFieldLabel => 'Nova Senha'; + + @override + String get passwordTextFieldInvalidErrorMessage => + 'Sua senha precisa ter pelo menos cinco caracteres.'; + + @override + String get passwordConfirmationTextFieldLabel => 'Confirmação da Nova Senha'; + + @override + String get passwordConfirmationTextFieldInvalidErrorMessage => + 'Suas senhas precisam ser iguais.'; +} diff --git a/14-automated-testing/projects/challenge/packages/features/update_profile/pubspec.yaml b/14-automated-testing/projects/challenge/packages/features/update_profile/pubspec.yaml index 18afb6ab..11b78caf 100644 --- a/14-automated-testing/projects/challenge/packages/features/update_profile/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/features/update_profile/pubspec.yaml @@ -20,9 +20,9 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter: generate: true diff --git a/14-automated-testing/projects/challenge/packages/form_fields/pubspec.yaml b/14-automated-testing/projects/challenge/packages/form_fields/pubspec.yaml index 2c530e1d..feed53bc 100644 --- a/14-automated-testing/projects/challenge/packages/form_fields/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/form_fields/pubspec.yaml @@ -9,5 +9,5 @@ dependencies: equatable: ^2.0.3 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/key_value_storage/pubspec.yaml b/14-automated-testing/projects/challenge/packages/key_value_storage/pubspec.yaml index a2e8301e..bca9f9c8 100644 --- a/14-automated-testing/projects/challenge/packages/key_value_storage/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/key_value_storage/pubspec.yaml @@ -5,11 +5,11 @@ environment: sdk: ">=2.13.0 <3.0.0" dependencies: - hive: ^2.2.3 + hive: 2.0.4 path_provider: ^2.0.2 dev_dependencies: build_runner: ^2.0.5 hive_generator: ^1.1.0 - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart index d1de7469..c2b15a41 100644 --- a/14-automated-testing/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart +++ b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/dynamic_link_service.dart @@ -1,6 +1,7 @@ +import 'dart:async'; + import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; import 'package:flutter/foundation.dart'; -import 'package:package_info/package_info.dart'; export 'package:firebase_dynamic_links/firebase_dynamic_links.dart' show SocialMetaTagParameters; @@ -9,7 +10,9 @@ typedef OnNewDynamicLinkPath = void Function(String newDynamicLinkPath); /// Wrapper around [FirebaseDynamicLinks]. class DynamicLinkService { - static const _domainUriPrefix = 'https://wonderwords.page.link'; + static const _domainUriPrefix = 'https://wonderwords1.page.link'; + static const _iOSBundleId = 'com.raywenderlich.wonderWords'; + static const _androidPackageName = 'com.raywenderlich.wonder_words'; DynamicLinkService({ @visibleForTesting FirebaseDynamicLinks? dynamicLinks, @@ -17,52 +20,41 @@ class DynamicLinkService { final FirebaseDynamicLinks _dynamicLinks; - Future getInitialDeepLinkPath() async { - final data = await _dynamicLinks.getInitialLink(); - final link = data?.link; - return link?.path; - } - - void setListener( - OnNewDynamicLinkPath onNewDynamicLinkPath, - ) { - _dynamicLinks.onLink( - onSuccess: ( - PendingDynamicLinkData? data, - ) async { - final link = data?.link; - final path = link?.path; - - if (path != null) { - onNewDynamicLinkPath(path); - } - }, - ); - } - Future generateDynamicLinkUrl({ required String path, SocialMetaTagParameters? socialMetaTagParameters, }) async { - final packageInfo = await PackageInfo.fromPlatform(); - final packageName = packageInfo.packageName; - final DynamicLinkParameters parameters = DynamicLinkParameters( + final parameters = DynamicLinkParameters( uriPrefix: _domainUriPrefix, link: Uri.parse( '$_domainUriPrefix$path', ), - androidParameters: AndroidParameters( - packageName: packageName, - minimumVersion: 0, + androidParameters: const AndroidParameters( + packageName: _androidPackageName, ), - iosParameters: IosParameters( - bundleId: packageName, - minimumVersion: '0', + iosParameters: const IOSParameters( + bundleId: _iOSBundleId, ), socialMetaTagParameters: socialMetaTagParameters, ); - final shortLink = await parameters.buildShortLink(); + final shortLink = await _dynamicLinks.buildShortLink(parameters); return shortLink.shortUrl.toString(); } + + Future getInitialDynamicLinkPath() async { + final data = await _dynamicLinks.getInitialLink(); + final link = data?.link; + return link?.path; + } + + Stream onNewDynamicLinkPath() { + return _dynamicLinks.onLink.map( + (PendingDynamicLinkData data) { + final link = data.link; + final path = link.path; + return path; + }, + ); + } } diff --git a/14-automated-testing/projects/challenge/packages/monitoring/pubspec.yaml b/14-automated-testing/projects/challenge/packages/monitoring/pubspec.yaml index 74362f59..9ee1fb00 100644 --- a/14-automated-testing/projects/challenge/packages/monitoring/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/monitoring/pubspec.yaml @@ -7,13 +7,12 @@ environment: dependencies: flutter: sdk: flutter - firebase_core: ^1.8.0 - firebase_crashlytics: ^2.3.0 - firebase_dynamic_links: ^2.0.7 + firebase_core: ^1.19.1 + firebase_crashlytics: ^2.8.4 + firebase_dynamic_links: ^4.3.1 firebase_analytics: ^9.1.12 - firebase_remote_config: ^2.0.2 - package_info: ^2.0.2 + firebase_remote_config: ^2.0.11 dev_dependencies: - lints: ^2.0.0 + lints: ^1.0.1 test: ^1.16.8 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/quote_repository/pubspec.yaml b/14-automated-testing/projects/challenge/packages/quote_repository/pubspec.yaml index e4328325..e01d8c24 100644 --- a/14-automated-testing/projects/challenge/packages/quote_repository/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/quote_repository/pubspec.yaml @@ -14,6 +14,6 @@ dependencies: path: ../domain_models dev_dependencies: - mocktail: ^0.3.0 + mocktail: 0.1.4 test: ^1.16.8 - lints: ^2.0.0 \ No newline at end of file + lints: ^1.0.1 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/packages/user_repository/pubspec.yaml b/14-automated-testing/projects/challenge/packages/user_repository/pubspec.yaml index 9d8f378e..6428373a 100644 --- a/14-automated-testing/projects/challenge/packages/user_repository/pubspec.yaml +++ b/14-automated-testing/projects/challenge/packages/user_repository/pubspec.yaml @@ -12,10 +12,10 @@ dependencies: domain_models: path: ../domain_models rxdart: ^0.27.1 - flutter_secure_storage: ^5.0.2 + flutter_secure_storage: ^4.2.0 dev_dependencies: mockito: ^5.2.0 test: ^1.16.8 - lints: ^2.0.0 + lints: ^1.0.1 build_runner: ^2.0.5 \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/pubspec.lock b/14-automated-testing/projects/challenge/pubspec.lock index 19edad7c..803bac5d 100644 --- a/14-automated-testing/projects/challenge/pubspec.lock +++ b/14-automated-testing/projects/challenge/pubspec.lock @@ -7,14 +7,14 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.11" + version: "3.3.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: @@ -84,7 +84,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -119,7 +119,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" fav_qs_api: dependency: "direct main" description: @@ -141,97 +141,97 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.2" - firebase: - dependency: transitive - description: - name: firebase - url: "https://pub.dartlang.org" - source: hosted - version: "9.0.3" firebase_analytics: dependency: transitive description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "8.3.4" + version: "9.1.12" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "3.1.10" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.0+1" + version: "0.4.0+17" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.17.0" + version: "1.19.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.4.3" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.6.6" firebase_crashlytics: dependency: transitive description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "2.8.4" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.6" + version: "3.2.10" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "4.3.1" + firebase_dynamic_links_platform_interface: + dependency: transitive + description: + name: firebase_dynamic_links_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3+6" firebase_remote_config: dependency: transitive description: name: firebase_remote_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.0.11" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.10" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.12" + version: "1.0.16" flutter: dependency: "direct main" description: flutter @@ -255,7 +255,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "1.0.4" flutter_localizations: dependency: "direct main" description: flutter @@ -274,14 +274,14 @@ packages: name: flutter_staggered_grid_view url: "https://pub.dartlang.org" source: hosted - version: "0.4.1" + version: "0.6.2" flutter_svg: dependency: transitive description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "1.1.1+1" + version: "0.22.0" flutter_test: dependency: "direct dev" description: flutter @@ -325,13 +325,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" - http: - dependency: transitive - description: - name: http - url: "https://pub.dartlang.org" - source: hosted - version: "0.13.4" http_parser: dependency: transitive description: @@ -342,12 +335,10 @@ packages: infinite_scroll_pagination: dependency: transitive description: - path: "." - ref: develop - resolved-ref: "1a7291cc7d1705f42482d450ecf1f2889ec75ce6" - url: "https://github.com/EdsonBueno/infinite_scroll_pagination.git" - source: git - version: "4.0.0" + name: infinite_scroll_pagination + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0-dev.1" integration_test: dependency: "direct dev" description: flutter @@ -387,28 +378,28 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.0.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -430,34 +421,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: - dependency: transitive - description: - name: package_info - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.2" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.5.1+1" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "0.2.1" path_provider: dependency: transitive description: @@ -513,7 +497,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "4.4.0" platform: dependency: transitive description: @@ -658,7 +642,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -686,35 +670,35 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" sync_http: dependency: transitive description: name: sync_http url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.12" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" update_profile: dependency: "direct main" description: @@ -798,7 +782,7 @@ packages: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "8.2.2" + version: "9.0.0" webdriver: dependency: transitive description: @@ -826,7 +810,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "5.3.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.11.0-0.1.pre" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.10.0" diff --git a/14-automated-testing/projects/challenge/pubspec.yaml b/14-automated-testing/projects/challenge/pubspec.yaml index 664ec376..b2dd1e71 100644 --- a/14-automated-testing/projects/challenge/pubspec.yaml +++ b/14-automated-testing/projects/challenge/pubspec.yaml @@ -64,7 +64,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^1.0.4 flutter_icons: From 0c8f382043e88785412e6ee3f1790fdf038cfecd Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:08:23 +0200 Subject: [PATCH 15/30] Testing challenges removed from final projects --- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- .../favorite_icon_button_widget_test.dart | 38 +------------------ .../favorite_icon_button_widget_test.dart | 17 --------- .../fav_qs_api/test/sign_in_test.dart | 17 --------- .../user_repository/test/mappers_test.dart | 9 ----- .../test/user_repository_test.dart | 8 ---- 117 files changed, 1 insertion(+), 1516 deletions(-) diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/01-setting-up-your-environment/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/01-setting-up-your-environment/projects/final/packages/user_repository/test/mappers_test.dart b/01-setting-up-your-environment/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/01-setting-up-your-environment/projects/final/packages/user_repository/test/mappers_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/01-setting-up-your-environment/projects/final/packages/user_repository/test/user_repository_test.dart b/01-setting-up-your-environment/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/01-setting-up-your-environment/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/01-setting-up-your-environment/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/01-setting-up-your-environment/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/01-setting-up-your-environment/projects/starter/packages/user_repository/test/mappers_test.dart b/01-setting-up-your-environment/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/01-setting-up-your-environment/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/01-setting-up-your-environment/projects/starter/packages/user_repository/test/user_repository_test.dart b/01-setting-up-your-environment/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/01-setting-up-your-environment/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/mappers_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/mappers_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/user_repository_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/mappers_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/user_repository_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/mappers_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/mappers_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/user_repository_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/user_repository_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/mappers_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/mappers_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/user_repository_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/mappers_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/user_repository_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/04-validating-forms-with-cubits/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/mappers_test.dart b/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/mappers_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/user_repository_test.dart b/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/mappers_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/user_repository_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/mappers_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/mappers_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/user_repository_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/mappers_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/user_repository_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/06-authenticating-users/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/06-authenticating-users/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/06-authenticating-users/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/06-authenticating-users/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/06-authenticating-users/projects/final/packages/user_repository/test/mappers_test.dart b/06-authenticating-users/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/06-authenticating-users/projects/final/packages/user_repository/test/mappers_test.dart +++ b/06-authenticating-users/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/06-authenticating-users/projects/final/packages/user_repository/test/user_repository_test.dart b/06-authenticating-users/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/06-authenticating-users/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/06-authenticating-users/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/06-authenticating-users/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/06-authenticating-users/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/06-authenticating-users/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/06-authenticating-users/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/06-authenticating-users/projects/starter/packages/user_repository/test/mappers_test.dart b/06-authenticating-users/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/06-authenticating-users/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/06-authenticating-users/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/06-authenticating-users/projects/starter/packages/user_repository/test/user_repository_test.dart b/06-authenticating-users/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/06-authenticating-users/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/06-authenticating-users/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/07-routing-and-navigating/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/07-routing-and-navigating/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/07-routing-and-navigating/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/07-routing-and-navigating/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/07-routing-and-navigating/projects/final/packages/user_repository/test/mappers_test.dart b/07-routing-and-navigating/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/07-routing-and-navigating/projects/final/packages/user_repository/test/mappers_test.dart +++ b/07-routing-and-navigating/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/07-routing-and-navigating/projects/final/packages/user_repository/test/user_repository_test.dart b/07-routing-and-navigating/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/07-routing-and-navigating/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/07-routing-and-navigating/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/08-deep-linking/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/08-deep-linking/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/08-deep-linking/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/08-deep-linking/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/08-deep-linking/projects/final/packages/user_repository/test/mappers_test.dart b/08-deep-linking/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/08-deep-linking/projects/final/packages/user_repository/test/mappers_test.dart +++ b/08-deep-linking/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/08-deep-linking/projects/final/packages/user_repository/test/user_repository_test.dart b/08-deep-linking/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/08-deep-linking/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/08-deep-linking/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/08-deep-linking/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/08-deep-linking/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/08-deep-linking/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/08-deep-linking/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/08-deep-linking/projects/starter/packages/user_repository/test/mappers_test.dart b/08-deep-linking/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/08-deep-linking/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/08-deep-linking/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/08-deep-linking/projects/starter/packages/user_repository/test/user_repository_test.dart b/08-deep-linking/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/08-deep-linking/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/08-deep-linking/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/09-internationalizing-and-localizing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/mappers_test.dart b/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/mappers_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/user_repository_test.dart b/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/mappers_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/user_repository_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart b/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart +++ b/14-automated-testing/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart b/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/14-automated-testing/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } diff --git a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..3f25ac86 100644 --- a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,42 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - - testWidgets('onTap() callback is executed when tapping on button', - (tester) async { - bool value = false; - - await tester.pumpWidget(MaterialApp( - locale: const Locale('en'), - localizationsDelegates: const [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - onTap: () { - value = !value; - }), - ), - )); - - await tester.tap(find.byType(FavoriteIconButton)); - - expect(value, true); - }); + // TODO: add implementation of widgetTest }); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart index b27b6a3f..0a147004 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,23 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - //Challange - testWidgets( - 'FavoriteIconButton uses outlined favorite icon when is not favorite', - (tester) async { - await tester.pumpWidget(const MaterialApp( - locale: Locale('en'), - localizationsDelegates: [ComponentLibraryLocalizations.delegate], - home: Scaffold( - body: FavoriteIconButton( - isFavorite: false, - )), - )); - - final outlinedIconFinder = find.byIcon(Icons.favorite_border_outlined); - expect(outlinedIconFinder, findsOneWidget); - }); - testWidgets('onTap() callback is executed when tapping on button', (tester) async { bool value = false; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart index 87cee833..f729507c 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -41,22 +41,5 @@ void main() { expect(await remoteApi.signIn(email, password), isA()); }); - - // Challange: - test( - 'When user enters wrong credentials, throws InvalidCredentialsFavQsException', - () async { - dioAdapter.onPost( - url, - (server) => server.reply( - 200, - {"error_code": 21, "message": "Invalid login or password."}, - delay: const Duration(seconds: 1), - ), - data: requestJsonBody, - ); - expect(() async => await remoteApi.signIn(email, password), - throwsA(isA())); - }); }); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/mappers_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/mappers_test.dart index 92015d11..4bdd5f30 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/mappers_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/mappers_test.dart @@ -13,14 +13,5 @@ void main() { expect(preference.toDomainModel(), DarkModePreference.alwaysDark); }); - - // Challange - test( - 'When mapping DarkModePreference.alwaysDark to cache, return DarkModePreferenceCM.alwaysDark', - () { - final preference = DarkModePreference.alwaysDark; - - expect(preference.toCacheModel(), DarkModePreferenceCM.alwaysDark); - }); }); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/user_repository_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/user_repository_test.dart index 3b5d574a..0ccd67fb 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/user_repository_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/user_repository/test/user_repository_test.dart @@ -28,13 +28,5 @@ void main() { expect(await _userRepository.getUserToken(), 'token'); }); - // Challange - test( - 'When calling getUserToken before successful authentication, return authentication null', - () async { - when(_userSecureStorage.getUserToken()).thenAnswer((_) async => null); - - expect(await _userRepository.getUserToken(), null); - }); }); } From 70ed1343dae9e8163633d4f7ab26ac8c50fd922b Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:16:22 +0200 Subject: [PATCH 16/30] Added build script for chapter 15 --- .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../challenge/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../challenge/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../project/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../challenge/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../starter/.github/workflows/cicd.yml | 64 +++++++++++++++++++ .../projects/final/.github/workflows/cicd.yml | 64 +++++++++++++++++++ 32 files changed, 2048 insertions(+) create mode 100644 01-setting-up-your-environment/projects/final/.github/workflows/cicd.yml create mode 100644 01-setting-up-your-environment/projects/starter/.github/workflows/cicd.yml create mode 100644 02-mastering-the-repository-pattern/projects/final/.github/workflows/cicd.yml create mode 100644 02-mastering-the-repository-pattern/projects/starter/.github/workflows/cicd.yml create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/.github/workflows/cicd.yml create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/.github/workflows/cicd.yml create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/.github/workflows/cicd.yml create mode 100644 04-validating-forms-with-cubits/projects/final/.github/workflows/cicd.yml create mode 100644 04-validating-forms-with-cubits/projects/starter/.github/workflows/cicd.yml create mode 100644 05-managing-complex-state-with-blocs/projects/final/.github/workflows/cicd.yml create mode 100644 05-managing-complex-state-with-blocs/projects/starter/.github/workflows/cicd.yml create mode 100644 06-authenticating-users/projects/final/.github/workflows/cicd.yml create mode 100644 06-authenticating-users/projects/starter/.github/workflows/cicd.yml create mode 100644 07-routing-and-navigating/projects/final/.github/workflows/cicd.yml create mode 100644 07-routing-and-navigating/projects/starter/.github/workflows/cicd.yml create mode 100644 08-deep-linking/projects/final/.github/workflows/cicd.yml create mode 100644 08-deep-linking/projects/starter/.github/workflows/cicd.yml create mode 100644 09-internationalizing-and-localizing/projects/final/.github/workflows/cicd.yml create mode 100644 09-internationalizing-and-localizing/projects/starter/.github/workflows/cicd.yml create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/.github/workflows/cicd.yml create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/.github/workflows/cicd.yml create mode 100644 11-create-your-own-widget-catalog/projects/challenge/.github/workflows/cicd.yml create mode 100644 11-create-your-own-widget-catalog/projects/final/.github/workflows/cicd.yml create mode 100644 11-create-your-own-widget-catalog/projects/starter/.github/workflows/cicd.yml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/.github/workflows/cicd.yml create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/starter/.github/workflows/cicd.yml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.github/workflows/cicd.yml create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.github/workflows/cicd.yml create mode 100644 14-automated-testing/projects/challenge/.github/workflows/cicd.yml create mode 100644 14-automated-testing/projects/final/.github/workflows/cicd.yml create mode 100644 14-automated-testing/projects/starter/.github/workflows/cicd.yml create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml diff --git a/01-setting-up-your-environment/projects/final/.github/workflows/cicd.yml b/01-setting-up-your-environment/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/01-setting-up-your-environment/projects/starter/.github/workflows/cicd.yml b/01-setting-up-your-environment/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/02-mastering-the-repository-pattern/projects/final/.github/workflows/cicd.yml b/02-mastering-the-repository-pattern/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/02-mastering-the-repository-pattern/projects/starter/.github/workflows/cicd.yml b/02-mastering-the-repository-pattern/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/.github/workflows/cicd.yml b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/.github/workflows/cicd.yml b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/.github/workflows/cicd.yml b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/04-validating-forms-with-cubits/projects/final/.github/workflows/cicd.yml b/04-validating-forms-with-cubits/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/04-validating-forms-with-cubits/projects/starter/.github/workflows/cicd.yml b/04-validating-forms-with-cubits/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/05-managing-complex-state-with-blocs/projects/final/.github/workflows/cicd.yml b/05-managing-complex-state-with-blocs/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/05-managing-complex-state-with-blocs/projects/starter/.github/workflows/cicd.yml b/05-managing-complex-state-with-blocs/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/06-authenticating-users/projects/final/.github/workflows/cicd.yml b/06-authenticating-users/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/06-authenticating-users/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/06-authenticating-users/projects/starter/.github/workflows/cicd.yml b/06-authenticating-users/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/06-authenticating-users/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/07-routing-and-navigating/projects/final/.github/workflows/cicd.yml b/07-routing-and-navigating/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/07-routing-and-navigating/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/07-routing-and-navigating/projects/starter/.github/workflows/cicd.yml b/07-routing-and-navigating/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/08-deep-linking/projects/final/.github/workflows/cicd.yml b/08-deep-linking/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/08-deep-linking/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/08-deep-linking/projects/starter/.github/workflows/cicd.yml b/08-deep-linking/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/08-deep-linking/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/09-internationalizing-and-localizing/projects/final/.github/workflows/cicd.yml b/09-internationalizing-and-localizing/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/09-internationalizing-and-localizing/projects/starter/.github/workflows/cicd.yml b/09-internationalizing-and-localizing/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/final/.github/workflows/cicd.yml b/10-dynamic-theming-and-dark-mode/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/.github/workflows/cicd.yml b/10-dynamic-theming-and-dark-mode/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/challenge/.github/workflows/cicd.yml b/11-create-your-own-widget-catalog/projects/challenge/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/final/.github/workflows/cicd.yml b/11-create-your-own-widget-catalog/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/11-create-your-own-widget-catalog/projects/starter/.github/workflows/cicd.yml b/11-create-your-own-widget-catalog/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/.github/workflows/cicd.yml b/12-supporting-the-development-lifecycle-with-firebase/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.github/workflows/cicd.yml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.github/workflows/cicd.yml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.github/workflows/cicd.yml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/14-automated-testing/projects/challenge/.github/workflows/cicd.yml b/14-automated-testing/projects/challenge/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/14-automated-testing/projects/challenge/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/14-automated-testing/projects/final/.github/workflows/cicd.yml b/14-automated-testing/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/14-automated-testing/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/14-automated-testing/projects/starter/.github/workflows/cicd.yml b/14-automated-testing/projects/starter/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/14-automated-testing/projects/starter/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml b/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml new file mode 100644 index 00000000..97f005c3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/.github/workflows/cicd.yml @@ -0,0 +1,64 @@ +name: Test, build and deploy + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: read-all + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Clone Flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get all packages and test + run: make get && make testing + + android: + name: Build Android + runs-on: ubuntu-latest + steps: + - name: Clone flutter repository with master channel + uses: subosito/flutter-action@v2 + with: + channel: master + + - name: Run flutter doctor + run: flutter doctor -v + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Clean, get and lint + run: make clean && make get && make lint + + - name: Build apk + run: flutter build apk + + - name: Firebase App Distribution + uses: wzieba/Firebase-Distribution-Github-Action@v1 + with: + appId: ${{ secrets.FIREBASE_APP_ID_ANDROID }} + token: ${{ secrets.FIREBASE_CLI_TOKEN }} + groups: ${{ secrets.TESTERS_GROUPS }} + file: build/app/outputs/flutter-apk/app-release.apk \ No newline at end of file From de81e451a30274d9d7ca831bfde8728cb7d7c1d2 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:32:12 +0200 Subject: [PATCH 17/30] Removed test content for component library --- .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../monitoring/lib/src/analytics_service.dart | 2 +- .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../monitoring/lib/src/analytics_service.dart | 2 +- .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ .../example/test/widget_test.dart | 20 +------------------ 32 files changed, 32 insertions(+), 572 deletions(-) diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart b/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart b/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart b/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart +++ b/06-authenticating-users/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart b/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/06-authenticating-users/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart b/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart +++ b/07-routing-and-navigating/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart b/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/07-routing-and-navigating/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/analytics_service.dart b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/analytics_service.dart index dcc3a202..d6db4664 100644 --- a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/analytics_service.dart +++ b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/analytics_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; class AnalyticsService { AnalyticsService({ @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); + }) : _analytics = analytics ?? FirebaseAnalytics.instance; final FirebaseAnalytics _analytics; diff --git a/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart b/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart +++ b/08-deep-linking/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart b/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/08-deep-linking/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/analytics_service.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/analytics_service.dart index dcc3a202..d6db4664 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/analytics_service.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/src/analytics_service.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; class AnalyticsService { AnalyticsService({ @visibleForTesting FirebaseAnalytics? analytics, - }) : _analytics = analytics ?? FirebaseAnalytics(); + }) : _analytics = analytics ?? FirebaseAnalytics.instance; final FirebaseAnalytics _analytics; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart b/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart +++ b/14-automated-testing/projects/challenge/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart b/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart +++ b/14-automated-testing/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart index 092d222f..0db063e3 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/component_library/example/test/widget_test.dart @@ -5,26 +5,8 @@ // 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:example/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); - }); + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); } From 8580dc8f619180b832896bc60b3bcbeaae41b136 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:33:59 +0200 Subject: [PATCH 18/30] Unused import removed --- .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../challenge/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../challenge/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../project/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../project/starter/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../challenge/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - .../projects/final/packages/fav_qs_api/test/sign_in_test.dart | 1 - 30 files changed, 30 deletions(-) diff --git a/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/01-setting-up-your-environment/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/01-setting-up-your-environment/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/06-authenticating-users/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/06-authenticating-users/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/07-routing-and-navigating/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/08-deep-linking/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/08-deep-linking/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/14-automated-testing/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart b/14-automated-testing/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart index 41ccc991..a81866a7 100644 --- a/14-automated-testing/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart +++ b/14-automated-testing/projects/challenge/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/14-automated-testing/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart index f729507c..98e60707 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/fav_qs_api/test/sign_in_test.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:fav_qs_api/src/fav_qs_api.dart'; -import 'package:fav_qs_api/src/models/exceptions.dart'; import 'package:fav_qs_api/src/models/models.dart'; import 'package:fav_qs_api/src/url_builder.dart'; import 'package:http_mock_adapter/http_mock_adapter.dart'; From d354201511b9896abfd43839ba311024561c1a54 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 01:56:14 +0200 Subject: [PATCH 19/30] Platforms updated for storybook --- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../example/test/widget_test.dart | 12 + .../component_library/example/web/index.html | 85 +-- .../example/android/app/build.gradle | 9 +- .../android/app/src/debug/AndroidManifest.xml | 3 +- .../android/app/src/main/AndroidManifest.xml | 11 +- .../app/src/main/res/values-night/styles.xml | 4 +- .../app/src/main/res/values/styles.xml | 4 +- .../app/src/profile/AndroidManifest.xml | 3 +- .../example/android/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../component_library/example/ios/.gitignore | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 21 +- .../xcshareddata/xcschemes/Runner.xcscheme | 8 +- .../example/ios/Runner/Info.plist | 4 + .../component_library/example/web/index.html | 85 +-- .../component_library/example/.gitignore | 46 ++ .../component_library/example/.metadata | 45 ++ .../component_library/example/README.md | 16 + .../example/analysis_options.yaml | 1 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 71 +++ .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 ++ .../com/example/example/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/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 8 + .../example/android/build.gradle | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 11 + .../example/assets/animations/loader.json | 1 + .../assets/animations/on_off_switch.riv | Bin 0 -> 3955 bytes .../component_library/example/ios/.gitignore | 34 ++ .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 484 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 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 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../example/ios/Runner/Info.plist | 51 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/component_storybook.dart | 34 ++ .../component_library/example/lib/main.dart | 6 + .../example/lib/stories.dart | 414 +++++++++++++ .../example/lib/story_app.dart | 22 + .../example/linux/.gitignore | 1 + .../example/linux/CMakeLists.txt | 138 +++++ .../example/linux/flutter/CMakeLists.txt | 88 +++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../component_library/example/linux/main.cc | 6 + .../example/linux/my_application.cc | 104 ++++ .../example/linux/my_application.h | 18 + .../example/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/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 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../component_library/example/pubspec.yaml | 23 + .../example/test/widget_test.dart | 12 + .../component_library/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../component_library/example/web/index.html | 58 ++ .../example/web/manifest.json | 35 ++ .../example/windows/.gitignore | 17 + .../example/windows/CMakeLists.txt | 101 ++++ .../example/windows/flutter/CMakeLists.txt | 104 ++++ .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 39 ++ .../example/windows/runner/Runner.rc | 121 ++++ .../example/windows/runner/flutter_window.cpp | 61 ++ .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 ++ .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../example/windows/runner/utils.cpp | 64 ++ .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 245 ++++++++ .../example/windows/runner/win32_window.h | 98 +++ 534 files changed, 6631 insertions(+), 2976 deletions(-) create mode 100644 14-automated-testing/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/.metadata create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/README.md create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/analysis_options.yaml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/build.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/debug/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/values-night/styles.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/build.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle.properties create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/settings.gradle create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/loader.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Info.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/component_storybook.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/main.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/stories.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/story_app.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/main.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Info.plist create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/pubspec.yaml create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/test/widget_test.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/favicon.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-192.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/index.html create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/manifest.json create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/.gitignore create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/Runner.rc create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/main.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/resource.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.h create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.h diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/build.gradle b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/build.gradle index 56bfa9b7..0833ecfc 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/build.gradle +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/build.gradle @@ -26,7 +26,8 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -44,8 +45,10 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.example" - minSdkVersion 16 - targetSdkVersion 30 + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml index c208884f..45d523a2 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,7 @@ - diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml index 34dd77ef..3f41384d 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/AndroidManifest.xml @@ -2,9 +2,11 @@ package="com.example.example"> - - diff --git a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml index 449a9f93..06952be7 100644 --- a/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml +++ b/01-setting-up-your-environment/projects/final/packages/component_library/example/android/app/src/main/res/values-night/styles.xml @@ -3,14 +3,14 @@ + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..45d523a2 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/build.gradle b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/build.gradle new file mode 100644 index 00000000..83ae2200 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + 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') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle.properties b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..cb24abda --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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.4-all.zip diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/settings.gradle b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/loader.json b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/loader.json new file mode 100644 index 00000000..7d4c61b4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":197.000008023974,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":138,"h":138,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":255,"h":185,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"search .png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.84],"y":[0]},"t":14,"s":[55]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[112]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[27]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[27]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.78],"y":[0]},"t":152,"s":[0]},{"t":197.000008023974,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.78,"y":0},"t":0,"s":[253.286,308.787,0],"to":[12.667,-4.167,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.84,"y":0},"t":14,"s":[272.286,224.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":41,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":48,"s":[315.286,304.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":69,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":76,"s":[194.286,245.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":0.22},"o":{"x":0.78,"y":0.78},"t":100,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":109,"s":[195.286,290.787,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":132,"s":[241.286,188.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":152,"s":[196.286,249.787,0],"to":[12.667,-4.167,0],"ti":[0,0,0]},{"i":{"x":0.22,"y":1},"o":{"x":0.78,"y":0},"t":174,"s":[226.286,308.787,0],"to":[0,0,0],"ti":[-12.667,4.167,0]},{"t":197.000008023974,"s":[253.3,308.8,0]}],"ix":2},"a":{"a":0,"k":[125.155,125.157,0],"ix":1},"s":{"a":0,"k":[100.938,100.938,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":23,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":1,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[118.927,43.139,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.071,99.071,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.121569001441,0.162906003466,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-64,10],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"open-book.png","cl":"png","tt":1,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[127,127,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"open-book.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":36,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[127.5,92.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":600.000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/assets/animations/on_off_switch.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ae8b835ac4c5bacf123bb3538582771df90d62a GIT binary patch literal 3955 zcmai0eQ;FO6~FIg--ZNslT9M-h9tY$Kp+byfskxMWZ&EOlEn}tkYK`xHQA622_z&0 zY*R-3npP@xMx7BwMMY}0L+NxzJ45@2NmyDdQ&3@KY!yeU9cDTe6&R=1cEoeeyZ7ze z7^i={eeZY9x##Qt?mgSy(%GEJ*b(Wd^peD8F~)9Y5(wTj;Crv(n6ozVqd;_QPwz;4 ztdGeGb1`4isM0$6^G0=6rNr)* znMa9*P+R)Wmix3I`YFRNman+VU-?hN4f?ote%FnKjNPv?*^#|&=+pypox-)+R5CrXU;@C@H62GPSmUJ?7jD$gmUs-Y{PKWJ*%!M2|X#m$2UIw z7oBA)`EK^vWwpS2{W<-nf9&0_L(lyf;;4kbY_75@bkp_XWa*_Vm(}3B>&1E*enD+s ze9B>aczqcTg{t5M*fRO*>t80_Y@&V=GMPtddY~hduEUE7DU~^uq74@z{X2?J z2lUPlpv<_{|urSyyik~f3iUzJ$Kl$n)mb@KH-hpsv z*VGHfaM#JL23w+(c6)j-RD7^BxV#sBezz52-}35{Mj~*D+vN2udA;$qIB3*fRBuJt z7yHc%+-9zFTgXw+a;kLut|>Km_UQt>48NfM`S{p+AoKkiO7!zBJ~h)8FPvd_7v(_N zljiPztv-ZYHaE5c6{^+Fh->_H*w~+!0FPxQ7Y9b@EVPw+_|Grvf;lUw53YAZ3zF_EY`;@!w2|hM0FcISlIB*6 zG>vJbi2!LD2d;6_Odx3@I}i^2^V%X~xYHz!*1f3jjq)?PAc)po(NmdD5QKd_H5C>? zR)^lnUwx`H;F(Z^&PTHKGW>#i4SZ}hdlk8gu_>)uVqPVme=cJH=Gj5W4pyW<5i3%& zUREQlD2llQ`gDE03a{+A%iJK)wdm4cjZz z|KjLM?aK4#Bf{{Rb6pW_;{#|Do%%>q^`c@Q8XmhRfv>Zb>mypr$Jf!PnShA=JrV3q zM6T15oR)=-2XLm4{%~gVczk$tDA90UYLu9-W)Ul_&0!@*L6h9v3hzpM$8x2wQ~(Bn zSLUBU&`F^8uWunp5a?=u1HoNgVcjxvGWzcq z5v(Fm(fk;K%>*(Ze;UCc0q36%BKRSJeOI1Dzyou{19OCdAteaptEsR>Z^b+(VR3*w zl}vnsU@3vDz^@U+2)sS#B7#i>K75zf3=rTBDEeCAj-p%Wx7dW%*q3kCVV;l+B3f5i zyBQ=oAZUxt|0byeC?qXo#}Hsz>x70vvRXd#C>u^-J@?`&0^je+@cM|1av zfPCN=9l8?ZZQP1G1R`f-R9Ne=R&i5O(zmZh2Df==AXZia*e}7)vv_7=psoUt2hKae zWD46`NyljpsK&Ue%aocv3Tt;y6TdXNPi1fkwDiG$q>-KAm!E(8x%|#ifsl5-f(HhXSz^F~3oa9X0M;3pguU}Hbv zko6{9hUb=UH*o;N)9b9V7Ias?;DII5Tq)HOtLgL~>>nPJJ^Ws~dQZ zIlI3TBgJ2czD}^$G~=8^Z|NPRG)yKghh=w~TTa>8T8dVt#$p(B&>zld>+f$EU%{BB z0ttMu8Rcw2leF>pwH-G=P-qFRUeHhwwglXw-V$(&22)^EgBLDZVA=3R<(7b3G+6>} z(QFC0g_utYZW=V-k8d%bu<+IxpHJq@;Pc5GR(wA7kr`cAso{eTe;|fW8Cme*Q%`^o zpH>2V_?VN351(zMA^N3;3Z*Gn=OGI|RDuNfP%$aUhstWw@S$Q(7^1CtjO6CK1UYAu zAs-FsoR0?ch=C#Whs3a9;z~CY;#azv5WmvRgs3YbQn#S!43W}E+AT1Vsd za0n989VmdsNI_jc3ZvxWmw=9>7A6JsDB+WS@^)ZzI d(^v#m8Hm^+Y1Z?gS_QZAVM#){gmMQ-*tZBx510S| literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/.gitignore b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..592ceee8 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..fdd2c9d3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,484 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; +/* End PBXBuildFile 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 = ""; }; +/* 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 = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + 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 */ + 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 = { + 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 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + 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; + 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 */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase 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)"; + DEVELOPMENT_TEAM = 424UUNETGR; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + 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)"; + DEVELOPMENT_TEAM = 424UUNETGR; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + 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)"; + DEVELOPMENT_TEAM = 424UUNETGR; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + 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 */ + 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..c87d15a3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Info.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Info.plist new file mode 100644 index 00000000..7f553465 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + 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 + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/component_storybook.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/component_storybook.dart new file mode 100644 index 00000000..13eaf55f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/component_storybook.dart @@ -0,0 +1,34 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/stories.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +class ComponentStorybook extends StatelessWidget { + final ThemeData lightThemeData, darkThemeData; + + const ComponentStorybook({ + Key? key, + required this.lightThemeData, + required this.darkThemeData, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final theme = WonderTheme.of(context); + return Storybook( + theme: lightThemeData, + darkTheme: darkThemeData, + localizationDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ComponentLibraryLocalizations.delegate, + ], + children: [ + ...getStories(theme), + ], + initialRoute: 'rounded-choice-chip', + ); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/main.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/main.dart new file mode 100644 index 00000000..151c4cf0 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/main.dart @@ -0,0 +1,6 @@ +import 'package:component_library_storybook/story_app.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(StoryApp()); +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/stories.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/stories.dart new file mode 100644 index 00000000..84b8d902 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/stories.dart @@ -0,0 +1,414 @@ +import 'package:component_library/component_library.dart'; +import 'package:flutter/material.dart'; +import 'package:storybook_flutter/storybook_flutter.dart'; + +List getStories(WonderThemeData theme) { + return [ + Story.simple( + name: 'Simple Expanded Elevated Button', + section: 'Buttons', + child: ExpandedElevatedButton( + label: 'Press me', + onTap: () {}, + ), + ), + Story( + name: 'Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton( + label: k.text( + label: 'label', + initial: 'Press me', + ), + onTap: k.boolean( + label: 'onTap', + initial: true, + ) + ? () {} + : null, + icon: Icon( + k.options( + label: 'icon', + initial: Icons.home, + options: const [ + Option( + 'Login', + Icons.login, + ), + Option( + 'Refresh', + Icons.refresh, + ), + Option( + 'Logout', + Icons.logout, + ), + ], + ), + ), + ), + ), + Story( + name: 'InProgress Expanded Elevated Button', + section: 'Buttons', + builder: (_, k) => ExpandedElevatedButton.inProgress( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'InProgress Text Button', + section: 'Buttons', + builder: (_, k) => InProgressTextButton( + label: k.text( + label: 'label', + initial: 'Processing', + ), + ), + ), + Story( + name: 'Favorite Button', + section: 'Buttons', + builder: (_, k) => FavoriteIconButton( + onTap: () {}, + isFavorite: k.boolean( + label: 'isFavorite', + initial: false, + ), + ), + ), + Story.simple( + name: 'Share Icon Button', + section: 'Buttons', + child: ShareIconButton(onTap: () {}), + ), + Story( + name: 'Count Indicator Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => CountIndicatorIconButton( + count: k.sliderInt( + label: 'count', + ), + iconData: k.options( + label: 'iconData', + initial: Icons.arrow_upward, + options: const [ + Option( + 'Upward', + Icons.arrow_upward, + ), + Option( + 'Downward', + Icons.arrow_downward, + ), + ], + ), + tooltip: k.text( + label: 'tooltip', + initial: 'Count indicator', + ), + ), + ), + Story( + name: 'Upvote Icon Button', + section: 'Count Indicator Buttons', + builder: (_, k) => UpvoteIconButton( + count: k.sliderInt( + label: 'count', + max: 10, + min: 0, + initial: 0, + divisions: 9, + ), + onTap: () {}, + isUpvoted: k.boolean( + label: 'isUpvoted', + initial: false, + ), + ), + ), + Story( + name: 'Exception Indicator', + section: 'Indicators', + builder: (_, k) => ExceptionIndicator( + title: k.text( + label: 'title', + initial: 'Exception title', + ), + message: k.text( + label: 'message', + initial: 'Exception message', + ), + onTryAgain: k.boolean( + label: 'onTryAgain', + initial: false, + ) + ? () {} + : null, + ), + ), + Story( + name: 'QuoteCard', + section: 'Quote', + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: + 'Wherever you go, no matter what the weather, always bring your own sunshine.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in List', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.separated( + itemCount: 15, + itemBuilder: (_, __) => child, + separatorBuilder: (_, __) => const Divider( + height: 16.0, + ), + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'The finest steel has to go through the hottest fire.', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story( + name: 'Quotes in Grid', + section: 'Quote', + wrapperBuilder: (context, story, child) => Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.count( + crossAxisCount: 2, + crossAxisSpacing: theme.gridSpacing, + mainAxisSpacing: theme.gridSpacing, + children: [for (int i = 0; i < 15; i++) child], + ), + ), + builder: (_, k) => QuoteCard( + isFavorite: k.boolean( + label: 'Is Favorite', + initial: false, + ), + statement: k.text( + label: 'Statement', + initial: 'A quote statement', + ), + author: k.text( + label: 'Author', + initial: 'Author name', + ), + ), + ), + Story.simple( + name: 'Centered Circular Progress Indicator', + child: const CenteredCircularProgressIndicator(), + ), + Story( + name: 'Rounded Choice Chip', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => RoundedChoiceChip( + label: k.text( + label: 'label', + initial: 'I am a Chip!', + ), + isSelected: k.boolean( + label: 'isSelected', + initial: false, + ), + avatar: k.boolean( + label: 'avatar', + initial: false, + ) + ? Icon( + Icons.favorite, + color: theme.roundedChoiceChipSelectedAvatarColor, + ) + : null, + onSelected: k.boolean( + label: 'onSelected', + initial: true, + ) + ? (_) {} + : null, + backgroundColor: k.options( + label: 'backgroundColor', + initial: null, + options: const [ + Option( + 'Light blue', + Colors.lightBlue, + ), + Option( + 'Red accent', + Colors.redAccent, + ), + ], + ), + selectedBackgroundColor: k.options( + label: 'selectedBackgroundColor', + initial: null, + options: const [ + Option( + 'Green', + Colors.green, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + labelColor: k.options( + label: 'labelColor', + initial: null, + options: const [ + Option( + 'Teal', + Colors.teal, + ), + Option( + 'Orange accent', + Colors.orangeAccent, + ), + ], + ), + selectedLabelColor: k.options( + label: 'selectedLabelColor', + initial: null, + options: const [ + Option( + 'Deep purple accent', + Colors.deepPurpleAccent, + ), + Option( + 'Amber accent', + Colors.amberAccent, + ), + ], + ), + ), + ), + Story( + name: 'Chevron List Tile', + padding: const EdgeInsets.all( + Spacing.medium, + ), + builder: (_, k) => ChevronListTile( + label: k.text( + label: 'label', + initial: 'Update Profile', + ), + ), + ), + Story.simple( + name: 'Search Bar', + child: const SearchBar(), + ), + Story.simple( + name: 'Row App Bar', + child: const RowAppBar( + children: [ + FavoriteIconButton( + isFavorite: true, + ), + UpvoteIconButton( + count: 10, + isUpvoted: true, + ), + DownvoteIconButton( + count: 5, + isDownvoted: false, + ), + ], + ), + ), + Story( + name: 'Shrinkable Text', + builder: (_, k) => SafeArea( + child: ShrinkableText( + k.text( + label: 'text', + initial: + 'I am shrinkable text. I can resize myself automatically within a space.', + ), + style: k.options( + label: 'style', + initial: theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + options: [ + Option( + 'XX large', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.xxLarge, + ), + ), + Option( + 'Small', + theme.quoteTextStyle.copyWith( + fontSize: FontSize.small, + ), + ), + ], + ), + textAlign: k.options( + label: 'textAlign', + initial: null, + options: const [ + Option( + 'Start', + TextAlign.start, + ), + Option( + 'End', + TextAlign.end, + ), + Option( + 'Center', + TextAlign.center, + ), + Option( + 'Justify', + TextAlign.justify, + ), + Option( + 'Left', + TextAlign.left, + ), + Option( + 'Right', + TextAlign.right, + ), + ], + ), + ), + ), + ), + ]; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/story_app.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/story_app.dart new file mode 100644 index 00000000..1c1b2ad1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/lib/story_app.dart @@ -0,0 +1,22 @@ +import 'package:component_library/component_library.dart'; +import 'package:component_library_storybook/component_storybook.dart'; +import 'package:flutter/material.dart'; + +class StoryApp extends StatelessWidget { + StoryApp({Key? key}) : super(key: key); + + final _lightTheme = LightWonderThemeData(); + final _darkTheme = DarkWonderThemeData(); + + @override + Widget build(BuildContext context) { + return WonderTheme( + lightTheme: _lightTheme, + darkTheme: _darkTheme, + child: ComponentStorybook( + lightThemeData: _lightTheme.materialThemeData, + darkThemeData: _darkTheme.materialThemeData, + ), + ); + } +} \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/.gitignore b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/CMakeLists.txt new file mode 100644 index 00000000..74c66dd4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# 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 "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.example") + +# 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/main.cc b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.cc b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.cc new file mode 100644 index 00000000..0ba8f430 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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, "example"); + 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, "example"); + } + + 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/.gitignore b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..c2efd0b6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c84862c6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + 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 */ + 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 */ + 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 */ + 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 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.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 */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + 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 */ + 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 /* example.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 = { + 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 */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 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; + 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 */ + 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 */ + 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 */ + 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.11; + 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.11; + 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.11; + 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 */ + 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..fb7259e1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 zcmaiYXH?Tqu=Xz`p-L#B_gI#0we$cm_HcmYFP$?wjD#BaCN4mzC5#`>w9y6=ThxrYZc0WPXprg zYjB`UsV}0=eUtY$(P6YW}npdd;%9pi?zS3k-nqCob zSX_AQEf|=wYT3r?f!*Yt)ar^;l3Sro{z(7deUBPd2~(SzZ-s@0r&~Km2S?8r##9-< z)2UOSVaHqq6}%sA9Ww;V2LG=PnNAh6mA2iWOuV7T_lRDR z&N8-eN=U)-T|;wo^Wv=34wtV0g}sAAe}`Ph@~!|<;z7*K8(qkX0}o=!(+N*UWrkEja*$_H6mhK1u{P!AC39} z|3+Z(mAOq#XRYS)TLoHv<)d%$$I@+x+2)V{@o~~J-!YUI-Q9%!Ldi4Op&Lw&B>jj* zwAgC#Y>gbIqv!d|J5f!$dbCXoq(l3GR(S>(rtZ~Z*agXMMKN!@mWT_vmCbSd3dUUm z4M&+gz?@^#RRGal%G3dDvj7C5QTb@9+!MG+>0dcjtZEB45c+qx*c?)d<%htn1o!#1 zpIGonh>P1LHu3s)fGFF-qS}AXjW|M*2Xjkh7(~r(lN=o#mBD9?jt74=Rz85I4Nfx_ z7Z)q?!};>IUjMNM6ee2Thq7))a>My?iWFxQ&}WvsFP5LP+iGz+QiYek+K1`bZiTV- zHHYng?ct@Uw5!gquJ(tEv1wTrRR7cemI>aSzLI^$PxW`wL_zt@RSfZ1M3c2sbebM* ze0=;sy^!90gL~YKISz*x;*^~hcCoO&CRD)zjT(A2b_uRue=QXFe5|!cf0z1m!iwv5GUnLw9Dr*Ux z)3Lc!J@Ei;&&yxGpf2kn@2wJ2?t6~obUg;?tBiD#uo$SkFIasu+^~h33W~`r82rSa ztyE;ehFjC2hjpJ-e__EH&z?!~>UBb=&%DS>NT)1O3Isn-!SElBV2!~m6v0$vx^a<@ISutdTk1@?;i z<8w#b-%|a#?e5(n@7>M|v<<0Kpg?BiHYMRe!3Z{wYc2hN{2`6(;q`9BtXIhVq6t~KMH~J0~XtUuT06hL8c1BYZWhN zk4F2I;|za*R{ToHH2L?MfRAm5(i1Ijw;f+0&J}pZ=A0;A4M`|10ZskA!a4VibFKn^ zdVH4OlsFV{R}vFlD~aA4xxSCTTMW@Gws4bFWI@xume%smAnuJ0b91QIF?ZV!%VSRJ zO7FmG!swKO{xuH{DYZ^##gGrXsUwYfD0dxXX3>QmD&`mSi;k)YvEQX?UyfIjQeIm! z0ME3gmQ`qRZ;{qYOWt}$-mW*>D~SPZKOgP)T-Sg%d;cw^#$>3A9I(%#vsTRQe%moT zU`geRJ16l>FV^HKX1GG7fR9AT((jaVb~E|0(c-WYQscVl(z?W!rJp`etF$dBXP|EG z=WXbcZ8mI)WBN>3<@%4eD597FD5nlZajwh8(c$lum>yP)F}=(D5g1-WVZRc)(!E3} z-6jy(x$OZOwE=~{EQS(Tp`yV2&t;KBpG*XWX!yG+>tc4aoxbXi7u@O*8WWFOxUjcq z^uV_|*818$+@_{|d~VOP{NcNi+FpJ9)aA2So<7sB%j`$Prje&auIiTBb{oD7q~3g0 z>QNIwcz(V-y{Ona?L&=JaV5`o71nIsWUMA~HOdCs10H+Irew#Kr(2cn>orG2J!jvP zqcVX0OiF}c<)+5&p}a>_Uuv)L_j}nqnJ5a?RPBNi8k$R~zpZ33AA4=xJ@Z($s3pG9 zkURJY5ZI=cZGRt_;`hs$kE@B0FrRx(6K{`i1^*TY;Vn?|IAv9|NrN*KnJqO|8$e1& zb?OgMV&q5|w7PNlHLHF) zB+AK#?EtCgCvwvZ6*u|TDhJcCO+%I^@Td8CR}+nz;OZ*4Dn?mSi97m*CXXc=};!P`B?}X`F-B5v-%ACa8fo0W++j&ztmqK z;&A)cT4ob9&MxpQU41agyMU8jFq~RzXOAsy>}hBQdFVL%aTn~M>5t9go2j$i9=(rZ zADmVj;Qntcr3NIPPTggpUxL_z#5~C!Gk2Rk^3jSiDqsbpOXf^f&|h^jT4|l2ehPat zb$<*B+x^qO8Po2+DAmrQ$Zqc`1%?gp*mDk>ERf6I|42^tjR6>}4`F_Mo^N(~Spjcg z_uY$}zui*PuDJjrpP0Pd+x^5ds3TG#f?57dFL{auS_W8|G*o}gcnsKYjS6*t8VI<) zcjqTzW(Hk*t-Qhq`Xe+x%}sxXRerScbPGv8hlJ;CnU-!Nl=# zR=iTFf9`EItr9iAlAGi}i&~nJ-&+)Y| zMZigh{LXe)uR+4D_Yb+1?I93mHQ5{pId2Fq%DBr7`?ipi;CT!Q&|EO3gH~7g?8>~l zT@%*5BbetH)~%TrAF1!-!=)`FIS{^EVA4WlXYtEy^|@y@yr!C~gX+cp2;|O4x1_Ol z4fPOE^nj(}KPQasY#U{m)}TZt1C5O}vz`A|1J!-D)bR%^+=J-yJsQXDzFiqb+PT0! zIaDWWU(AfOKlSBMS};3xBN*1F2j1-_=%o($ETm8@oR_NvtMDVIv_k zlnNBiHU&h8425{MCa=`vb2YP5KM7**!{1O>5Khzu+5OVGY;V=Vl+24fOE;tMfujoF z0M``}MNnTg3f%Uy6hZi$#g%PUA_-W>uVCYpE*1j>U8cYP6m(>KAVCmbsDf39Lqv0^ zt}V6FWjOU@AbruB7MH2XqtnwiXS2scgjVMH&aF~AIduh#^aT1>*V>-st8%=Kk*{bL zzbQcK(l2~)*A8gvfX=RPsNnjfkRZ@3DZ*ff5rmx{@iYJV+a@&++}ZW+za2fU>&(4y`6wgMpQGG5Ah(9oGcJ^P(H< zvYn5JE$2B`Z7F6ihy>_49!6}(-)oZ(zryIXt=*a$bpIw^k?>RJ2 zQYr>-D#T`2ZWDU$pM89Cl+C<;J!EzHwn(NNnWpYFqDDZ_*FZ{9KQRcSrl5T>dj+eA zi|okW;6)6LR5zebZJtZ%6Gx8^=2d9>_670!8Qm$wd+?zc4RAfV!ZZ$jV0qrv(D`db zm_T*KGCh3CJGb(*X6nXzh!h9@BZ-NO8py|wG8Qv^N*g?kouH4%QkPU~Vizh-D3<@% zGomx%q42B7B}?MVdv1DFb!axQ73AUxqr!yTyFlp%Z1IAgG49usqaEbI_RnbweR;Xs zpJq7GKL_iqi8Md?f>cR?^0CA+Uk(#mTlGdZbuC*$PrdB$+EGiW**=$A3X&^lM^K2s zzwc3LtEs5|ho z2>U(-GL`}eNgL-nv3h7E<*<>C%O^=mmmX0`jQb6$mP7jUKaY4je&dCG{x$`0=_s$+ zSpgn!8f~ya&U@c%{HyrmiW2&Wzc#Sw@+14sCpTWReYpF9EQ|7vF*g|sqG3hx67g}9 zwUj5QP2Q-(KxovRtL|-62_QsHLD4Mu&qS|iDp%!rs(~ah8FcrGb?Uv^Qub5ZT_kn%I^U2rxo1DDpmN@8uejxik`DK2~IDi1d?%~pR7i#KTS zA78XRx<(RYO0_uKnw~vBKi9zX8VnjZEi?vD?YAw}y+)wIjIVg&5(=%rjx3xQ_vGCy z*&$A+bT#9%ZjI;0w(k$|*x{I1c!ECMus|TEA#QE%#&LxfGvijl7Ih!B2 z6((F_gwkV;+oSKrtr&pX&fKo3s3`TG@ye+k3Ov)<#J|p8?vKh@<$YE@YIU1~@7{f+ zydTna#zv?)6&s=1gqH<-piG>E6XW8ZI7&b@-+Yk0Oan_CW!~Q2R{QvMm8_W1IV8<+ zQTyy=(Wf*qcQubRK)$B;QF}Y>V6d_NM#=-ydM?%EPo$Q+jkf}*UrzR?Nsf?~pzIj$ z<$wN;7c!WDZ(G_7N@YgZ``l;_eAd3+;omNjlpfn;0(B7L)^;;1SsI6Le+c^ULe;O@ zl+Z@OOAr4$a;=I~R0w4jO`*PKBp?3K+uJ+Tu8^%i<_~bU!p%so z^sjol^slR`W@jiqn!M~eClIIl+`A5%lGT{z^mRbpv}~AyO%R*jmG_Wrng{B9TwIuS z0!@fsM~!57K1l0%{yy(#no}roy#r!?0wm~HT!vLDfEBs9x#`9yCKgufm0MjVRfZ=f z4*ZRc2Lgr(P+j2zQE_JzYmP0*;trl7{*N341Cq}%^M^VC3gKG-hY zmPT>ECyrhIoFhnMB^qpdbiuI}pk{qPbK^}0?Rf7^{98+95zNq6!RuV_zAe&nDk0;f zez~oXlE5%ve^TmBEt*x_X#fs(-En$jXr-R4sb$b~`nS=iOy|OVrph(U&cVS!IhmZ~ zKIRA9X%Wp1J=vTvHZ~SDe_JXOe9*fa zgEPf;gD^|qE=dl>Qkx3(80#SE7oxXQ(n4qQ#by{uppSKoDbaq`U+fRqk0BwI>IXV3 zD#K%ASkzd7u>@|pA=)Z>rQr@dLH}*r7r0ng zxa^eME+l*s7{5TNu!+bD{Pp@2)v%g6^>yj{XP&mShhg9GszNu4ITW=XCIUp2Xro&1 zg_D=J3r)6hp$8+94?D$Yn2@Kp-3LDsci)<-H!wCeQt$e9Jk)K86hvV^*Nj-Ea*o;G zsuhRw$H{$o>8qByz1V!(yV{p_0X?Kmy%g#1oSmlHsw;FQ%j9S#}ha zm0Nx09@jmOtP8Q+onN^BAgd8QI^(y!n;-APUpo5WVdmp8!`yKTlF>cqn>ag`4;o>i zl!M0G-(S*fm6VjYy}J}0nX7nJ$h`|b&KuW4d&W5IhbR;-)*9Y0(Jj|@j`$xoPQ=Cl literal 0 HcmV?d00001 diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..8b42559e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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 = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Info.plist b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..2722837e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/pubspec.yaml b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/pubspec.yaml new file mode 100644 index 00000000..b295e253 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/pubspec.yaml @@ -0,0 +1,23 @@ +name: component_library_storybook +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.14.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + component_library: + path: ../ + storybook_flutter: ^0.8.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 + +flutter: + uses-material-design: true + assets: + - assets/animations/ \ No newline at end of file diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/test/widget_test.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/test/widget_test.dart new file mode 100644 index 00000000..0db063e3 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/test/widget_test.dart @@ -0,0 +1,12 @@ +// 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_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/favicon.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-192.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-512.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-maskable-192.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/icons/Icon-maskable-512.png b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/index.html b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/index.html new file mode 100644 index 00000000..41b3bc33 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/manifest.json b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/.gitignore b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/CMakeLists.txt new file mode 100644 index 00000000..c0270746 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example 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 "example") + +# 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..17411a8a --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/CMakeLists.txt @@ -0,0 +1,39 @@ +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_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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/Runner.rc b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/Runner.rc new file mode 100644 index 00000000..0f5c0857 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b43b9095 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#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()); + 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/main.cpp b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/main.cpp new file mode 100644 index 00000000..bcb57b0e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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.CreateAndShow(L"example", 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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/resource.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/resources/app_icon.ico b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.cpp b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#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); + 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, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/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/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..c10f08dc --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// 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 registar 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::CreateAndShow(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 | WS_VISIBLE, + 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; + } + + return OnCreate(); +} + +// 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; + } + + 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. +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.h b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.h new file mode 100644 index 00000000..17ba4311 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/component_library/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#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 and shows a win32 window with |title| and position and size 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 to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // 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 + // responsponds 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; + + 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_ From a057a81e9d33352947adcb2a679a598eed6d9040 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 13:11:07 +0200 Subject: [PATCH 20/30] TODO comment change to reflect the reader interaction better --- .../projects/starter/lib/screen_view_observer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart index 141a2625..0753dacf 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart @@ -9,7 +9,7 @@ class ScreenViewObserver extends RoutemasterObserver { final AnalyticsService analyticsService; - // TODO: replace with _sendScreenView() method implementation + // TODO: add _sendScreenView() hellper method // TODO: override didPush and didPop method } From bc65ebe42e1fb33666c0e988be755be20f428c73 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 13:11:36 +0200 Subject: [PATCH 21/30] Minor typo --- .../projects/starter/lib/screen_view_observer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart index 0753dacf..f43a4461 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/lib/screen_view_observer.dart @@ -9,7 +9,7 @@ class ScreenViewObserver extends RoutemasterObserver { final AnalyticsService analyticsService; - // TODO: add _sendScreenView() hellper method + // TODO: add _sendScreenView() helper method // TODO: override didPush and didPop method } From d90a9ba70680e56cd75501d4b4a9ca146e20cc05 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 13:26:28 +0200 Subject: [PATCH 22/30] Adding missing comment to follow the chapter --- .../projects/starter/packages/monitoring/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml index 9ee1fb00..2fc8ecb9 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/pubspec.yaml @@ -8,11 +8,11 @@ dependencies: flutter: sdk: flutter firebase_core: ^1.19.1 - firebase_crashlytics: ^2.8.4 + # TODO: Add crashlytics packages firebase_dynamic_links: ^4.3.1 firebase_analytics: ^9.1.12 firebase_remote_config: ^2.0.11 dev_dependencies: lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file + test: ^1.16.8 From ed7db0f818cf8ddc9cf64ab8eb45d735c17489b9 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 13:31:31 +0200 Subject: [PATCH 23/30] Added two missing comments lost in project updating --- .../projects/starter/android/app/build.gradle | 2 +- .../projects/starter/android/build.gradle | 2 +- .../projects/starter/pubspec.lock | 14 -------------- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle index 7d93d0b6..9933bb19 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/app/build.gradle @@ -24,7 +24,7 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' -apply plugin: 'com.google.firebase.crashlytics' +// TODO: apply Firebase Crashlytics plugin apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle index a4793051..2cd9da42 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/android/build.gradle @@ -9,7 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.10' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' + // TODO: add Firebase Crashlytics classpath } } diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock index 803bac5d..0398eeab 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/pubspec.lock @@ -183,20 +183,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.6" - firebase_crashlytics: - dependency: transitive - description: - name: firebase_crashlytics - url: "https://pub.dartlang.org" - source: hosted - version: "2.8.4" - firebase_crashlytics_platform_interface: - dependency: transitive - description: - name: firebase_crashlytics_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.10" firebase_dynamic_links: dependency: transitive description: From 8713ceaea9efe83743d0f4c2d900a6b0d8fb7ccd Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 13:36:33 +0200 Subject: [PATCH 24/30] Removing code missed in updating --- .../ios/Runner.xcodeproj/project.pbxproj | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj index 3053d607..6c5ef549 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 204D416158E532E25B11E6ED /* GoogleService-Info.plist in Sources */ = {isa = PBXBuildFile; fileRef = 7447E687D8FC8498062FB41C /* GoogleService-Info.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 674A56860F34FA7D8FF4591C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEDDB0ADE7D878836D65843 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -37,6 +38,7 @@ 1C1DCFABE303EC12C2182106 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 278CC2C532C0A5F7F2630FBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7447E687D8FC8498062FB41C /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.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 = ""; }; @@ -90,6 +92,7 @@ 97C146EF1CF9000F007C117D /* Products */, A231D06941EC426CD09FC4D3 /* Pods */, 772A70B30FBD21C39A96DD10 /* Frameworks */, + 7447E687D8FC8498062FB41C /* GoogleService-Info.plist */, ); sourceTree = ""; }; @@ -141,7 +144,6 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 18D5ABA327EF75FA008E4DC0 /* ShellScript */, 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */, ); buildRules = ( @@ -202,23 +204,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 18D5ABA327EF75FA008E4DC0 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:682647902252:ios:7ea50d61da146656155989\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:682647902252:ios:7ea50d61da146656155989\n"; - }; 2A61EAEDE35F29C988702B6A /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -295,6 +280,7 @@ files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 204D416158E532E25B11E6ED /* GoogleService-Info.plist in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From b421a85c7fc44eb364c8c49112e664da8dd17b7e Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 14:23:11 +0200 Subject: [PATCH 25/30] Added missing package --- .../project/starter/packages/monitoring/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml index 9ee1fb00..c5ee69b6 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/pubspec.yaml @@ -11,8 +11,8 @@ dependencies: firebase_crashlytics: ^2.8.4 firebase_dynamic_links: ^4.3.1 firebase_analytics: ^9.1.12 - firebase_remote_config: ^2.0.11 + # TODO: add firebase_remote_config package dev_dependencies: lints: ^1.0.1 - test: ^1.16.8 \ No newline at end of file + test: ^1.16.8 From 9e8b3cbff05ddf7cbd72bc99ca16a4965e2bce45 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 14:23:42 +0200 Subject: [PATCH 26/30] Minor change --- .../packages/monitoring/lib/src/remote_value_service.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart index b9694b58..98facbf9 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -1,4 +1,3 @@ -import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:flutter/foundation.dart'; /// Wrapper around [FirebaseRemoteConfig]. From 24631b9f3049771932595b00165084262bbcbd44 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 14:27:26 +0200 Subject: [PATCH 27/30] Added missing comment --- .../packages/monitoring/lib/src/remote_value_service.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart index 98facbf9..b5c6c6b3 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/remote_value_service.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; +// TODO: import firebase_remote_config package /// Wrapper around [FirebaseRemoteConfig]. class RemoteValueService { - // TODO: add an implementation of RemoteValueService class +// TODO: add an implementation of RemoteValueService class } From e41d82d3036ec94a063de0aff5603b04eeba9668 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 14:31:56 +0200 Subject: [PATCH 28/30] Minor changes --- .../quote_list/lib/src/quote_list_screen.dart | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart index 3a404f25..c73adfe5 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/features/quote_list/lib/src/quote_list_screen.dart @@ -151,22 +151,23 @@ class _QuoteListViewState extends State { const FilterHorizontalList(), Expanded( child: RefreshIndicator( - onRefresh: () { - _bloc.add( - const QuoteListRefreshed(), - ); - - // Returning a Future inside `onRefresh` enables the loading - // indicator to disappear automatically once the refresh is - // complete. - final stateChangeFuture = _bloc.stream.first; - return stateChangeFuture; - }, - // TODO: display different UI based on the value of grid_quotes_view_enabled parameter - child: QuotePagedGridView( - pagingController: _pagingController, - onQuoteSelected: widget.onQuoteSelected, - )), + onRefresh: () { + _bloc.add( + const QuoteListRefreshed(), + ); + + // Returning a Future inside `onRefresh` enables the loading + // indicator to disappear automatically once the refresh is + // complete. + final stateChangeFuture = _bloc.stream.first; + return stateChangeFuture; + }, + // TODO: display different UI based on the value of grid_quotes_view_enabled parameter + child: QuotePagedGridView( + pagingController: _pagingController, + onQuoteSelected: widget.onQuoteSelected, + ), + ), ), ], ), From bffcaabe02550e92043b5dfc4473ca608cb03e33 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 15:46:44 +0200 Subject: [PATCH 29/30] Typo fixed --- .../projects/starter/integration_test/app_test.dart | 2 +- .../test/favorite_icon_button_widget_test.dart | 2 +- .../projects/starter/packages/fav_qs_api/test/sign_in_test.dart | 2 +- .../packages/user_repository/test/user_repository_test.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/14-automated-testing/projects/starter/integration_test/app_test.dart b/14-automated-testing/projects/starter/integration_test/app_test.dart index cf67228b..12b8de89 100644 --- a/14-automated-testing/projects/starter/integration_test/app_test.dart +++ b/14-automated-testing/projects/starter/integration_test/app_test.dart @@ -5,5 +5,5 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:wonder_words/main.dart' as app; void main() { - // TODO: add implementation of integration test + // TODO: add an implementation of integration test } diff --git a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart index 3f25ac86..100490bb 100644 --- a/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart +++ b/14-automated-testing/projects/starter/packages/component_library/test/favorite_icon_button_widget_test.dart @@ -5,6 +5,6 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('FavoriteIconButton tests: ', () { - // TODO: add implementation of widgetTest + // TODO: add an implementation of widgetTest }); } diff --git a/14-automated-testing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart b/14-automated-testing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart index 5246ac99..acb074ae 100644 --- a/14-automated-testing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart +++ b/14-automated-testing/projects/starter/packages/fav_qs_api/test/sign_in_test.dart @@ -31,7 +31,7 @@ void main() { ), ).toJson(); - // TODO: add implementation of request stubbing + // TODO: add an implementation of request stubbing // 4 expect(await remoteApi.signIn(email, password), isA()); diff --git a/14-automated-testing/projects/starter/packages/user_repository/test/user_repository_test.dart b/14-automated-testing/projects/starter/packages/user_repository/test/user_repository_test.dart index ef3f146f..f8243f34 100644 --- a/14-automated-testing/projects/starter/packages/user_repository/test/user_repository_test.dart +++ b/14-automated-testing/projects/starter/packages/user_repository/test/user_repository_test.dart @@ -1,6 +1,6 @@ // TODO: add missing packages and an annotation to generate the mock void main() { - // TODO: add implementation for UserRepository.getUserToken() test + // TODO: add an implementation for UserRepository.getUserToken() test // Challenge } From 2722ba311afa4579d934c017dd4ec4d60d49f1d4 Mon Sep 17 00:00:00 2001 From: Vid Palcar Date: Fri, 23 Sep 2022 18:17:01 +0200 Subject: [PATCH 30/30] Explicit crash files added to all chapters --- .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 2 +- .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ .../packages/monitoring/lib/monitoring.dart | 1 + .../monitoring/lib/src/explicit_crash.dart | 16 ++++++++++++++++ 65 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 06-authenticating-users/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 06-authenticating-users/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 07-routing-and-navigating/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 08-deep-linking/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 08-deep-linking/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 14-automated-testing/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 14-automated-testing/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 14-automated-testing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/explicit_crash.dart create mode 100644 15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/explicit_crash.dart diff --git a/01-setting-up-your-environment/projects/final/packages/monitoring/lib/monitoring.dart b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/01-setting-up-your-environment/projects/final/packages/monitoring/lib/monitoring.dart +++ b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/01-setting-up-your-environment/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/monitoring.dart b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/01-setting-up-your-environment/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/monitoring.dart b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/monitoring.dart +++ b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/monitoring.dart b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/02-mastering-the-repository-pattern/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/monitoring.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/monitoring.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/monitoring.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/monitoring.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/monitoring.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/03-managing-state-with-cubits-and-the-bloc-library/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/monitoring.dart b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/monitoring.dart +++ b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/monitoring.dart b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/04-validating-forms-with-cubits/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/monitoring.dart b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/monitoring.dart +++ b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/monitoring.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/05-managing-complex-state-with-blocs/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/06-authenticating-users/projects/final/packages/monitoring/lib/monitoring.dart b/06-authenticating-users/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/06-authenticating-users/projects/final/packages/monitoring/lib/monitoring.dart +++ b/06-authenticating-users/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/06-authenticating-users/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/06-authenticating-users/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/06-authenticating-users/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/06-authenticating-users/projects/starter/packages/monitoring/lib/monitoring.dart b/06-authenticating-users/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/06-authenticating-users/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/06-authenticating-users/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/06-authenticating-users/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/06-authenticating-users/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/06-authenticating-users/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/07-routing-and-navigating/projects/final/packages/monitoring/lib/monitoring.dart b/07-routing-and-navigating/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/07-routing-and-navigating/projects/final/packages/monitoring/lib/monitoring.dart +++ b/07-routing-and-navigating/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/07-routing-and-navigating/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/monitoring.dart b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/07-routing-and-navigating/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/08-deep-linking/projects/final/packages/monitoring/lib/monitoring.dart b/08-deep-linking/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/08-deep-linking/projects/final/packages/monitoring/lib/monitoring.dart +++ b/08-deep-linking/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/08-deep-linking/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/08-deep-linking/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/08-deep-linking/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/08-deep-linking/projects/starter/packages/monitoring/lib/monitoring.dart b/08-deep-linking/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/08-deep-linking/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/08-deep-linking/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/08-deep-linking/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/08-deep-linking/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/08-deep-linking/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/monitoring.dart b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/monitoring.dart +++ b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/monitoring.dart b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/09-internationalizing-and-localizing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/monitoring.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/monitoring.dart +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/monitoring.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/10-dynamic-theming-and-dark-mode/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/11-create-your-own-widget-catalog/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/monitoring.dart b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/monitoring.dart index d3382fe4..806b6f85 100644 --- a/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/12-supporting-the-development-lifecycle-with-firebase/projects/starter/packages/monitoring/lib/monitoring.dart @@ -2,8 +2,8 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; -export 'src/explicit_crash.dart'; // TODO: export error_reporting_service.dart file +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/monitoring.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/monitoring.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/explicit_crash.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/monitoring.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/monitoring.dart +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/explicit_crash.dart b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/13-running-live-experiments-with-a-b-testing-and-feature-flags/project/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/14-automated-testing/projects/challenge/packages/monitoring/lib/monitoring.dart b/14-automated-testing/projects/challenge/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/14-automated-testing/projects/challenge/packages/monitoring/lib/monitoring.dart +++ b/14-automated-testing/projects/challenge/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/14-automated-testing/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/14-automated-testing/projects/challenge/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/14-automated-testing/projects/final/packages/monitoring/lib/monitoring.dart b/14-automated-testing/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/14-automated-testing/projects/final/packages/monitoring/lib/monitoring.dart +++ b/14-automated-testing/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/14-automated-testing/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/14-automated-testing/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/14-automated-testing/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/14-automated-testing/projects/starter/packages/monitoring/lib/monitoring.dart b/14-automated-testing/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/14-automated-testing/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/14-automated-testing/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/14-automated-testing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/14-automated-testing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/14-automated-testing/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/monitoring.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/monitoring.dart +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/explicit_crash.dart b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/final/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +} diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/monitoring.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/monitoring.dart index d2d3fba8..f9c72b46 100644 --- a/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/monitoring.dart +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/monitoring.dart @@ -3,6 +3,7 @@ import 'package:firebase_core/firebase_core.dart'; export 'src/dynamic_link_service.dart'; export 'src/analytics_service.dart'; export 'src/error_reporting_service.dart'; +export 'src/explicit_crash.dart'; export 'src/remote_value_service.dart'; Future initializeMonitoringPackage() => Firebase.initializeApp(); diff --git a/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/explicit_crash.dart b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/explicit_crash.dart new file mode 100644 index 00000000..86864715 --- /dev/null +++ b/15-automating-test-executions-and-build-distributions/projects/starter/packages/monitoring/lib/src/explicit_crash.dart @@ -0,0 +1,16 @@ +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; + +class ExplicitCrash { + ExplicitCrash({ + @visibleForTesting FirebaseCrashlytics? crashlytics, + }) : _crashlytics = crashlytics ?? FirebaseCrashlytics.instance; + + // 1 + final FirebaseCrashlytics _crashlytics; + + // 2 + crashTheApp() { + _crashlytics.crash(); + } +}